В Linux CentOS 7 я использую именованные каналы fifo, созданные с помощью mkfifo, для обработки передачи данных между парами процессов, работающих на многопроцессорном дисковом сервере (Dell R730xd с ОЗУ 132 ГБ и диском RAID 20 ТБ).
Чтобы иметь некоторый буфер данных между двумя процессами, подключенными к каналу, когда я открываю канал, я также установил его размер на некоторое большое значение (скажем, 128 МБ).
Чтобы разрешить трубы большого размера, я должен был установить:
/proc/sys/fs/pipe-max-size = 134217728
/proc/sys/fs/pipe-user-pages-soft = 0 (i.e. no limit)
В моем коде я тогда использую (пример из сценария Perl)
fcntl(\*FD, F_SETPIPE_SZ, int($size))
Время от времени происходит сбой операции установки размера канала с сообщением "Невозможно выделить память". Я заметил, что это происходит, когда активность диска на сервере очень высока. Просматривая /proc /meminfo, я вижу, что кэшированная память занимает большую часть памяти моего сервера, оставляя только несколько МБ памяти MemFree. Как только активность диска уменьшается, кэшированная память медленно уменьшается, и через некоторое время операция размера канала снова начинает работать.
Мои вопросы:
- почему размер канала конфликтует с кэшированной памятью? Не следует ли освобождать кэшированную память, как только кому-то это понадобится (например, у меня нет проблем при запуске новых процессов)?
- Как ограничить максимальный объем памяти, который может быть выделен для кэширования диска? Я предполагаю, что ограничение его до 100 ГБ вместо 132 ГБ не должно сильно влиять на производительность диска, и это оставило бы много памяти для моих каналов ...
Заранее благодарю за любую помощь.