Почему Linux не очищает кэши автоматически?

Почему Linux не очищает кэши автоматически?

Фон

Мой вопрос по сути является продолжением этоговопросиотвечать, и в частности, этокомментарий.

Всякий раз, когда мне приходится копировать или синхронизировать большие объемы файлов, память в моей системе имеет тенденцию заполняться, поэтому я запускаю такой скрипт (как пользователь root):

while true ; do echo "syncing" && sync && echo 3 > /proc/sys/vm/drop_caches && echo "done" && sleep 60 ; done ;

Вопросы

  • Может ли это каким-либо образом нанести вред системе или вызвать какие-либо негативные последствия? (В частности, какие «риски» упомянуты в указанном комментарии?)
  • Если ответ «нет» (а я так и предполагаю), то почему Linux не запускает эту команду автоматически по умолчанию? (Я не вижу никаких заметных изменений из-за этого, я только замечаю, что у меня не заканчивается память...)

решение1

Потому что нет никакой выгоды в удалении кэшей. Забывание вещей — это не то, где есть выгода. Выгода в повторном использовании памяти, это произойдет в любом случае. В какой-то момент данные будут вытеснены из памяти.

Однако выполнение этих больших задач может нанести ущерб производительности: если данные кэшируются, но никогда не используются повторно, это приводит к удалению других данных, что не дает никакой выгоды.

Поэтому вам нужно запустить задание без кэширования (к сожалению, я не помню команду, чтобы это сделать).

решение2

Почему Linux не очищает кэши автоматически?

Это будет.

ron> free -g
             total       used       free     shared    buffers     cached
Mem:           504        415         88          1          0        352
-/+ buffers/cache:         62        441
Swap:            0          0          0

Кэшированную память по-прежнему следует считать свободной памятью.

Когда количество свободных данных достигнет 0, они будут извлечены из кэша.

Может ли это каким-либо образом навредить системе или вызвать какие-либо негативные последствия?

вред = нет. Исследуйте echo 3 > /proc/sys/vm/drop_caches, и вы увидите, что этонеразрушающийоперация.

отрицательным эффектом будет потеря производительности, вызванная необходимостью считывать что-то с диска, что было бы в кэше. Например, напишите программу на C, которая считывает файл данных размером 10 ГБ. При первом запуске она будет медленной, потому что она считывает с диска, но в любое время после этого она будет работать намного быстрее, потому что этот файл данных кэшируется в оперативной памяти. Удалите кэш, и следующий последующий запуск программы, считывающей файл данных, будет медленным, как и при первом запуске. Это легко заметить и повторить.

Если ответ «нет», то почему Linux не запускает эту команду автоматически по умолчанию?

Вам придется объяснить, как и где это происходит. Я не знаю об этом в современных Linux, таких как RHEL/CentOS 7.7. Но в старых Linux (например, с ядром до 3.x) это могло быть решением, принятым дистрибутивом, когда кэширование не было таким надежным, как сейчас (по моему мнению). Используя SLES 11.4 несколько лет назад, я почти уверен, что люди из SuSE не писали код, чтобы этот кэш удаления выполнялся автоматически, но для некоторых рабочих серверов люди, у которых мы их купили, настроили SLES для нас в то время, и сделали crontab для периодического кэширования удаления, так что это своего рода серая зона относительно того, почему это делается. Я подозреваю, что это менталитет «уборка = хорошее», и поскольку это никогда не деструктивная команда, это не может навредить. Несколько раз я вручную делал это echo 3 > drop_cachesв sles 11.4 для устранения неполадок, поскольку это никогда не решало ничего, что в конечном итоге требовало перезагрузки.

Посмотрите руководство по настройке производительности RHEL и настройке виртуальной памяти. Я не знаю, насколько это относится к RHEL или является достаточно низкоуровневым, чтобы быть связанным со всем ядром Linux, а не специфичным для дистрибутива Linux. Также, что изменилось с ядра 2.6 до 3.x и 4.x, что, я уверен, является существенным в этом отношении, поэтому подумайте о том, чтобы прочитать примечания к выпуску ядра Linux.

Связанный контент