Обычно ядро Linux очищает кеш записи, если превышено указанное ограничение по времени или кеш заполнен. Это приводит к зависанию жестких дисков, поскольку процесс записи значительно замедляет процесс чтения.
Вот почему я хочу избежать сброса кеша записи, если есть только небольшая активность чтения.
Поскольку у меня 40 ГБ ОЗУ, это не должно быть проблемой. Мои мысли по этому поводу заключаются в том, чтобы установить ограничение по времени на пять минут, настроить размер кеша записи в соответствии с вашими потребностями и написать скрипт, который очищает кеш ТОЛЬКО, если нет активности чтения. Я не знаю, как это сделать, будет ли команда оболочки синхронизировать
предложить достаточно хорошую производительность?
Моя цель - иметь кеш записи размером 1,2 ГБ. Промывание этого заняло бы много времени. Есть ли что-то, что можно остановить, как только снова появится активность чтения или более высокий PSI диска (будет ли это реагировать достаточно быстро??)
У меня есть два диска Seagate (не smr?): ST1000DM010-2EP102 - но я думаю, что эта информация не нужна.
С грязное_отношение
В настоящее время я установил динамический размер кеша.
эхо 360000 > /proc/sys/vm/dirty_expire_centisecs
эхо 360000 > /proc/sys/vm/dirty_writeback_centisecs
Это установит максимальное время для начала сброса кеша записи на 1 час.
Справка: https://unix.stackexchange.com/questions/30286/can-i-configure-my-linux-system-for-more-aggressive-file-system-caching
Полезные команды:
С помощью следующей команды вы можете увидеть, сколько находится в кеше записи:
кошка /proc/meminfo | grep Грязный
Вывод:
Грязный: 104 КБ
Но это не очень важно..
Где я застрял?
Я хочу иметь возможность почти мгновенно отменить команду синхронизации (возможно ли это вообще), и я хочу знать, есть ли чтение процесса. Это все, что мне нужно для написания сценария.
Я нашел старый скрипт, который может отслеживать активность чтения: awk '{print $1}' /sys/block/sdb/stat
Как это использовать?
если [ $old-value -lt $new-value ];то КОМАНДА;fi