Почему Linux не кэширует объект и / или файлы «.so» при использовании компоновщика GNU?

#caching #linux-kernel #ld

#кэширование #linux-ядро #ld

Вопрос:

При связывании исполняемых файлов (более 200) в большом проекте я получаю скорость соединения 0,5 исполняемых файла в секунду, даже если я запустил этап соединения за минуту до этого. vmstat показывает скорость чтения с диска более 20 МБ / с.

Но если я предварительно кэширую каталог сборки, используя «tar cf / dev / null build-dir» один раз, я получаю постоянную скорость соединения 4,8 исполняемых файлов в секунду, а скорость чтения с диска практически равна нулю.

Почему Linux не кэширует объектные файлы и / или файлы «.so», когда они считываются компоновщиком GNU, но делает это, когда они считываются tar? Оперативной памяти достаточно (16 ГБ). Версия ядра 4.4.146. CentOS 7.5.

Комментарии:

1. Вы используете жесткий диск, а не SSD?

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

Ответ №1:

Похоже, что причиной этого неправильного поведения была неправильная настройка vm.vfs_cache_pressure = 1000. Установка значения 70 устранила проблему и восстановила хорошую производительность кэша.

И документация явно рекомендует не увеличивать значение выше 100. К сожалению, интернет полон примеров с безумными значениями, такими как 1000.