Вопрос или проблема
Я знаю, что недавно открытые файлы кэшируются в ОЗУ, но существует ли кэш для частых команд?
Например, если я запускаю cat file.txt
несколько раз, file.txt
будет кэшироваться после первой команды.
- Но если я запускаю
ps aux
несколько раз, будет ли вывод первой команды кэшироваться где-то? - Имеет ли каждое приложение свой собственный кэш для частых команд, например,
git log
?
Операционная система кэширует блоки диска и иноды, но не сами файлы. Кэширование блоков диска создает эффект видимого кэширования файлов.
Не существует уровня кэша для приложений со стороны операционной системы. Некоторые приложения, выполняющие сложные операции, могут иметь свой собственный кэш, который приложение реализует само, записывая файлы на диск.
Например, если вы посмотрите в ваш домашний каталог, там может быть скрытая директория под названием ~/.cache/
, содержащая файлы кэша приложения. Точно так же могут быть глобальные кэши в /var/cache/
.
Однако команде вроде ps
на самом деле не нужен кэш, так как его вывод очень динамичный и не настолько тяжел для генерации, поэтому смысла в кэше немного. В отличие от этого, atop
полагается на учет процессов для сбора долгосрочной информации о процессах; он может либо собирать это в течение 10 секунд, либо извлекать это из кэша учета процессов.
Система будет кэшировать файлы, связанные с командой-исполнителем и любые файлы, считанные с диска, когда команда выполняется. Последующие выполнения команды потенциально могут извлечь выгоду из этого кэширования и потребовать меньше обычного доступа к диску. Это будет прозрачно как для пользователя, так и для самой команды.
Однако вывод не кэшируется. Каждое выполнение команды будет генерировать новый вывод, даже если этот вывод идентичен предыдущему.
В примерах ps aux
нет ничего, что предотвратило бы Linux от необходимости исследовать текущий список процессов и выводить этот список согласно переданным аргументам. Точно так же git log
будет получать доступ к журналу текущего репозитория и выводить его без избегания выполнения команды или чтения сохраненного состояния репозитория и т. д.
Команды могут извлечь выгоду из различного кэшируемого файловой системой, буферами и т. д., но вывод будет воссоздаваться с нуля каждый раз.
Реализация универсального кэша для вывода команд была бы чрезвычайно сложной, поскольку обычно вы не знаете, какие изменения в системе могут сделать кэш недействительным. Некоторые команды требуют изменений файлов, прежде чем они сгенерируют другой вывод, в то время как другие генерируют другой вывод из-за течения времени, случайного шанса или других событий.
Отдельная команда может кэшировать свой вывод или использовать контрольные точки, чтобы избежать повторного выполнения ресурсовоемких вычислений. Тем не менее, они будут делать это в пределах своей конкретной области проблемы (кэши различных видов компиляторов, контрольные точки детерминированных симуляций в научном ПО и т.д.), и это не будет чем-то, что операционная система делает для них прозрачно.
-
Нет, первое применяется обычно только к кэшу страниц. Некоторые приложения действительно кэшируют любые операции, которые они выполняют, но это не распространено. Базы данных используют хитрый трюк, называемый индексированием. Существует инструмент для ускорения компиляции, он использует кэш диска, напр.,
ccache
. Есть много различных вариантов, но кэш страниц является единственным универсальным решением для кэширования чтения и записи на диск. Да, записи также кэшируются, это называется грязные страницы.
Ответ или решение
Linux не реализует специальный кэш для стандартного вывода команд, но использует кэширование дисковых блоков и inode для оптимизации работы с недавно доступными файлами. Это включает в себя кэширование таких операций, как чтение файла через cat file.txt
, что позволяет системе быстрее обращаться к файлам, которые часто используются.
-
Кэширование вывода команд:
Когда вы запускаете команды, такие какps aux
, вывод каждого выполнения команды будет формироваться заново. Операционная система не хранит выход данных команд в кэше на системном уровне, так как такой кэш мог бы быстро устаревать и часто не приносил бы пользы из-за изменчивой природы подобных данных. -
Кэширование в приложениях:
Отдельные приложения могут иметь собственные механизмы кэширования, которые они разрабатывают для оптимизации своей работы. Например,git log
не будет кэшировать вывод. Однако некоторые приложения могут хранить временные данные или результаты в скрытых каталогах пользователя, таких как~/.cache/
, или в глобальных кэшах, расположенных в/var/cache/
.
Итак, операционная система Linux главным образом кэширует те данные с диска, которые требуются для запуска команд, но не их вывод. Это предоставляет неявное ускорение во время последующих операций, связанных с чтением файлов. Системный уровень кэширования включается только на уровне доступа к файлам и метаданным файловой системы. Стратегия создания универсального кэша для всех возможных команд была бы сложна, поскольку нельзя точно определить, какие изменения в системе потребуют сброса значений кэша.
Эти аспекты кэширования помогают Linux поддерживать производительность на высоком уровне, оставляя специфическое кэширование на усмотрение отдельных приложений, когда это необходимо. В результате, пользователи и администраторы получают преимущества как от системного, так и от пользовательского кэширования, что помогает балансировать производительность с актуальностью данных.