Кажется, что в нашем коде возникают задержки, когда доступная память приближается к min_free_kbytes, и наш код пытается выделить большой объем памяти (1-2 ГБ в течение 15-30 секунд). Мы видим, что большая часть памяти используется файловым кешем и обычно восстанавливается всякий раз, когда мы приближаемся к min_free_kbytes. Однако, когда мы приближаемся к пределу, и нашему коду внезапно требуется много памяти, мы видим, что kswapd срабатывает, и он блокирует процессор на 5-40 секунд.
Мы смогли почти полностью решить эту проблему, подняв значение min_free_kbytes до 3 ГБ (из 64 ГБ), но затем мы поняли, что это фактически не позволяет существующим процессам использовать эту доступную оперативную память. Казалось, что повышение этого значения заставляло ОС чаще восстанавливать память из файлового кэша, что приводило к снижению пиковых задержек на 99% просто потому, что оно было менее вероятно вблизи значения min_free_kbytes. В идеале мы хотели бы использовать всю доступную оперативную память и не иметь этих пиков задержки.
Есть ли способ заставить файловый кеш начать восстанавливаться со значением выше min_free_kbytes? Мы думали о запуске «sync && echo 3> / proc / sys / vm / drop_caches» всякий раз, когда оно опускается ниже определенного нами значения, но я сомневаюсь, что это рекомендуемый или лучший вариант.