1

В 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. Как только активность диска уменьшается, кэшированная память медленно уменьшается, и через некоторое время операция размера канала снова начинает работать.

Мои вопросы:

  1. почему размер канала конфликтует с кэшированной памятью? Не следует ли освобождать кэшированную память, как только кому-то это понадобится (например, у меня нет проблем при запуске новых процессов)?
  2. Как ограничить максимальный объем памяти, который может быть выделен для кэширования диска? Я предполагаю, что ограничение его до 100 ГБ вместо 132 ГБ не должно сильно влиять на производительность диска, и это оставило бы много памяти для моих каналов ...

Заранее благодарю за любую помощь.

0