Фон
Мой вопрос по сути является продолжением этоговопросиотвечать, и в частности, этокомментарий.
Всякий раз, когда мне приходится копировать или синхронизировать большие объемы файлов, память в моей системе имеет тенденцию заполняться, поэтому я запускаю такой скрипт (как пользователь 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.