У меня есть простой сценарий, где два сервера связаны через гигабитную связь.
Я запускаю iperf с обеих сторон, чтобы измерить пропускную способность.
Что удивляет меня, всякий раз, когда я запускаю трафик в двух направлениях, он всегда предпочитает только одну сторону (например, ~ 900 Мбит / с против ~ 100 Мбит / с). Если я запускаю трафик однонаправленно, каждая сторона получает ~ 900 Мбит / с.
Если я подключу один из серверов (нижний объем памяти) к другому серверу, двунаправленный трафик будет сбалансирован. Так что определенно не проблема с iperf.
Другие факты:
- Один сервер имеет довольно большой объем памяти (~ 12 ГБ), а другой - только ~ 4 ГБ.
- Оба сервера имеют одинаковые конфигурации памяти TCP, в данном случае одинаковые TCP w / r mem, core w / r mem, длина очереди TX.
- Оба используют одну и ту же сетевую карту (драйвер E1000).
- Та же версия Linux, RedHat 2.6.9. Большой сервер работает под управлением 64-разрядной версии благодаря 12 ГБ памяти.
- У обоих нет другого трафика, кроме небольшого SSH и случайного пинга каждую секунду.
- Оба имеют "tcp_moderate_rcvbuf".
Вопросы:
- Почему дисбаланс?
- Какую область я должен посмотреть, если буфер сокета интенсивно используется с одной стороны, и как?
- Кроме iperf, какие еще хорошие программы (не аппаратное обеспечение / тестер) для измерения производительности?
- Какой лучший способ получить представление о том, как Linux распределяет буфер, из кольцевого буфера Ethernet, буфера TCP, буфера сокетов и других буферов?
- Что может быть другой сущностью, которая может повлиять на пропускную способность, которую я не рассмотрел выше?
- Существует ли какая-либо документация, объясняющая, как Linux распределяет распределение памяти между пользователем, ядром, драйверами устройств и сетевым стеком?
Любой совет высоко ценится.