В Linux уже давно есть проблема с программами, которые забирают всю «грязную» кэш-память системы. Происходит то, что процесс копирования заполняет кэш записи данными, которые он копирует, и делает это очень быстро. Поэтому, когда приходит Firefox и ему нужно писать, он должен сначала дождаться грязного буферного пространства или свободного места для записи в очередь диска. Во время ожидания он конкурирует с процессом копирования и потоком ядра pdflush, который перемещает данные из грязных буферов в очередь записи на диск.
У Firefox есть еще одна проблема в этом сценарии. Он использует SQLite для хранения своих закладок, истории и прочего. SQLite является ACID-совместимой базой данных и использует систему транзакций с записью на диск , сброшенной на диск . Таким образом, он должен не только ждать места в буфере, но и ждать, пока очередь диска, заполненная скопированным файлом, очистится, прежде чем он сможет подтвердить успешную запись.
Было много настроек для системы очередей и буферизации диска Linux. Изменения есть практически в каждом выпуске ядра. Попробуйте один из новых выпусков. Вы также можете попробовать настроить значения sysctl. Я вроде как:
vm.dirty_writeback_centisecs = 100
vm.dirty_expire_centisecs = 9000
vm.dirty_background_ratio = 4
vm.dirty_ratio = 80
Вы также можете попробовать настроить количество слотов в очереди диска. Это значение в /sys/block/sda/queue/nr_requests
. Вам нужно заменить sda
тем, что есть на самом деле. Чем больше слотов, тем больше шансов объединить запросы ввода-вывода, и планировщик ввода-вывода CFQ может лучше справляться с приоритетами. Меньшее количество слотов обычно означает более короткое время ожидания записи на диск для синхронного ввода-вывода, такого как транзакции SQLite. Меньшее количество слотов также означает более короткое время ожидания для ввода-вывода чтения в очередь на диске, если процесс с интенсивной записью полностью заполняет очередь записью ввода-вывода.