Подтвердить что ты не робот

Эффективно ли кэшируется файловая система Linux?

Я создаю веб-приложение, работающее на сервере Linux. Приложение постоянно обращается к файлу 250K - оно загружает его в память, считывает его и отправляет обратно некоторую информацию пользователю. Поскольку этот файл постоянно читается, мой клиент предлагает использовать что-то вроде memcache для кэширования его в память, по-видимому, потому, что он сделает операции чтения быстрее.

Однако я думаю, что файловая система Linux, вероятно, уже кэширует файл в памяти, так как он часто обращался к нему. Это правильно? На ваш взгляд, может ли memcache обеспечить реальное улучшение? Или он будет делать то же самое, что и в Linux?

Я не очень хорошо знаком ни с Linux, ни с memcache, поэтому я был бы очень признателен, если бы кто-то мог это прояснить.

4b9b3361

Ответ 1

Да, если вы не изменяете файл каждый раз, когда вы его открываете.

Linux будет хранить информацию о файлах на страницах с копией на запись в памяти, а "загрузка" файла в память должна быть очень быстрой (таблица страниц в худшем случае).

Изменить: Хотя, как указывает cdhowie, нет "файловой системы Linux". Тем не менее, я считаю, что соответствующий код находится в управлении памятью linux и поэтому не зависит от рассматриваемой файловой системы. Если вам интересно, вы можете прочитать в источнике linux об обработке объектов vm_area_struct в linux/mm/mmap.c, в основном.

Ответ 2

Как уже упоминалось, mmap - хорошее решение здесь.

Но один 250k файл очень маленький. Возможно, вы захотите его прочитать и поместить в какую-то структуру памяти, которая соответствует тому, что вы хотите отправить пользователю при запуске. Т.е., если это текстовый файл, массив строк может быть хорошим выбором и т.д.

Ответ 3

Да, определенно. Он будет хранить доступ к файлам в памяти на неопределенный срок, если только что-то еще не нуждается в памяти.

Вы можете управлять этим поведением (в некоторой степени) с помощью системного вызова fadvise. Более подробную информацию см. на странице "человек".

Системному вызову на чтение и запись по-прежнему обычно необходимо скопировать данные, поэтому, если вы видите реальное узкое место, сделайте это, подумайте об использовании mmap(), которое может избежать копирования, путем сопоставления страниц кеша непосредственно в процессе.

Ответ 4

Файл должен быть кэширован, но убедитесь, что параметр noatime установлен на mount, в противном случае время доступа будет пытаться сохранить в файл, что приведет к недействительности кеша.

Ответ 5

Я предполагаю, что включение этого файла в ramdisk (tmpfs) может сделать достаточное преимущество без больших изменений. Если вы действительно серьезно относитесь к времени отклика в блоке микросекунд.