Используя наши предыдущие наработки в тестировании производительности memcached на SunFire X2270 (сервера на базе процессоров Intel Xeon (Nehalem)) с OpenSolaris, мы решили запустить те же тесты на том же сервере, но с использованием RHEL5. Мы уже отмечали в посте с первыми результатами тестирования, что для того чтобы достичь максимально возможной производительности мы использовали сетевые карточки Intel Oplin 10GbE. Как выяснилось, для использования этой карточки под Linux, нам пришлось немного поработать над драйверами и пересобрать ядро.
Upd: Ответ Shanti почему они 2х2 использовали: Basically, we tried various settings to see which gives the best performance. On Linux, we got the best results with 2+2 rings. On OpenSolaris, it was 4+4. We suspect that the Linux implementation for multiple rings is probably not performing well yet (it is relatively new).
Краткий перевод: потому что гладиолус
- С драйвером по умолчанию ixgb из дистрибутива RedHat (версия 1.3.30-k2 в ядре 2.6.18) сетевой интерфейс просто подвисал при выполненнии теста.
- Поэтому нам пришлось загрузить драйвер с сайта Intel (1.3.56.11-2-NAPI) и пересобрать его. С ним все заработало и максимальную пропускную способность, которую мы получили, была 232K операций/секунду на том же ядре версии 2.6.18. Однако эта версия ядра не поддерживает многопоточную передачу данных (прим. переводчика — в оригинале multiply rings).
- Версия ядра 2.6.29 включает многопоточную передачу данных, но по прежнему не включает последнюю версию драйвера ixgb — 1.3.56-2-NAPI. Поэтому мы загрузили, собрали и установили новые версии ядра и драйвера. Это сработало и после небольшого тюнинга дало нам максимальную пропускную способность в 280К опер./сек.
Результаты
Как мы уже сообщали, система с OpenSolaris и memcached 1.3.2 давала нам максимальную пропускную способность около 350К опер./сек. На том же сервере с RHEL5 (с ядром 2.6.29) и той же версией memcached мы получили 280K опер./сек. Получается, что OpenSolaris обходит Linux на 25%!Тюнинг Linux
Следующие системные значения были использованы, чтобы получить максимальную производительностьnet.ipv4.tcp_timestamps = 0 net.core.wmem_default = 67108864 net.core.wmem_max = 67108864 net.core.optmem_max = 67108864 net.ipv4.tcp_dsack = 0 net.ipv4.tcp_sack = 0 net.ipv4.tcp_window_scaling = 0 net.core.netdev_max_backlog = 300000 net.ipv4.tcp_max_syn_backlog = 200000Следующие, специфические для ixgb-драйвера, параметры были установлены (2 очереди на прием и 2 на передачу)
RSS=2,2 InterruptThrottleRate =1600,1600
Тюнинг OpenSolaris
В /etc/system мы установили следующие параметры для MSI-X (прим. переводчика — в оригинале MSIX, но параметры относятся именно к MSI-X):set ddi_msix_alloc_limit=4 set pcplusmp:apic_intr_policy=1Для интерфейса ixgbe 4-е очереди на передачу и 4-е на прием, дали нам лучшее быстродействие:
tx_queue_number=4, rx_queue_number=4И кроме того мы выделили сетевому интерфейсу отдельные процессорные ядра:
dladm set-linkprop -p cpus=12,13,14,15 ixgbe0
Upd: Ответ Shanti почему они 2х2 использовали: Basically, we tried various settings to see which gives the best performance. On Linux, we got the best results with 2+2 rings. On OpenSolaris, it was 4+4. We suspect that the Linux implementation for multiple rings is probably not performing well yet (it is relatively new).
Краткий перевод: потому что гладиолус