
Проверьте кольцевой буфер сетевой карты:
# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 256
RX Mini: 0
RX Jumbo: 0
TX: 256
Можно установить «RX/TX» до предела, указанного в «Предустановленных максимальных значениях», например:
# ethtool -G eth0 rx 4096 rx 4096
Вопрос: по умолчанию;,почему они установлены так низко?(на каждом сервере, который у меня есть, все они на 256) вместо более высокого значения, или их максимальные возможности оборудования? Есть ли какие-либо недостатки (если да, то какие?) увеличения этих значений?
решение1
Во-первых, установленные вами цифры не соответствуютбайтыкак думают многие, они находятся вдескрипторы(а размер дескриптора зависит от оборудования). Таким образом, когда вы увеличиваете длину кольца, вы запрашиваете больше памяти, которая будет выделена в ядре для этих дескрипторов. В общем, вы хотите, чтобы эта память ядра находилась в кэше L1, чтобы обработка прерываний была максимально быстрой. Увеличение размера кольца делает это менее вероятным, а в некоторых случаях и вовсе невозможным.
Следующее, что нужно сделать, это объединить прерывания — в общем, когда вы увеличиваете размер кольцевого буфера, NIC соответствующим образом корректирует свои низкие/высокие отметки и запускает прерывание, когда буферизуется больше данных (то есть реже). Время, необходимое ядру для обработки этих больших объемов данных во время обработки прерываний, также увеличится в результате.
Все вышеперечисленное приводит к простому эффекту ведра - с большим кольцом вероятность потери пакетов уменьшается, а задержка сети увеличивается. Это может быть совершенно нормально, если вы транслируете большие файлы по TCP, и может быть совершенно нежелательным, если вы используете приложение с малыми задержками (например, игры и т. п.).
Цифры по умолчанию, которые вы видите, представляют собой разумный компромисс между этими двумя вариантами.