LINUX.ORG.RU
ФорумAdmin

nginx на Linux vs nginx на FreeBSD


2

5

Здравствуйте, дамы и господа.

Хочу поделиться следующим наблюдением, и спросить совета. Нужно поднять nginx в качестве реверсного прокси (фронтенд). Задача как-бы не сложная, но вот результаты какие-то странные. В процессе тестирования условия были сведены к абсолютному минимуму - на данный момент nginx отдает одну-единственную статическую страничку объемом 11 килобайт (которую изначально читает с бэкенд-веб сервера, но потом-то уже отдает из кэша) через чистый http, без ssl. И результат по FreeBSD примерно такой - более 500 хитов в секунду и около 60 Мбит/с трафика без дропов и тайм-аутов. На машинке пентиум-4 3,2 ГГц, правда, с серверной материнкой. Может, можно и больше, но канал в интернет 100 мегабит, и дальше уже не совсем понятно то ли машина не тянет, то ли провайдер. Под линуксом же наблюдается такое: при нагрузке более 60 хитов в секунду - начинаются отваливания и тайм-ауты, при этом трафик не превышает 6-7 мегабит. И это на более мощных машинах (пробовалось более одной), вплоть до Core i7 первого поколения. Конфигурация nginx, разумеется, одинаковая. Пробовал тюнить сеть на линуксе, и сам nginx по мотивам найденных в интернете статей, например этой, но всё это не дало никакого видимого результата. Я, конечно, знаю, что nginx изначально писался «with FreeBSD in mind», но, блин, не может же быть всё так фатально из-за этого? Вопрос, соответственно: что предпринять, чтобы приблизить результаты nginx/Linux к nginx/FreeBSD? Конфигурацию nginx скину ответом на это сообщение чуть позже, а настройки Linux даже и скидывать смысла нет, т.к. всё по-умолчанию давало те же результаты (Fedora 18 и Centos 6).

nginx.conf:

user  nginx;
worker_processes  2;
error_log  /var/log/nginx/error.log;
pid        /run/nginx.pid;
events {
    use epoll;
    multi_accept on;
    worker_connections  8192;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    proxy_cache_path /var/spool/nginx/cache levels=1:2 keys_zone=one:10m inactive=7d max_size=200m;
    proxy_set_header Range "";
    proxy_set_header Request-Range "";
    open_file_cache max=200000 inactive=20s;.
    open_file_cache_valid 30s;.
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    sendfile        on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;

server {
        listen 80;
        server_name servers.net;
        proxy_temp_path /var/spool/nginx/temp/server;
        access_log /var/log/nginx/server-access main;
        error_log  /var/log/nginx/server-error;
        keepalive_timeout    60;
        location / {
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Host $http_host;
                proxy_set_header X-URI $uri;
                proxy_set_header X-ARGS $args;
                proxy_set_header Refer $http_refer;
                proxy_set_header X-Forwarded-Proto https;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                client_max_body_size       10m;
                client_body_buffer_size    128k;
                proxy_connect_timeout      90;
                proxy_send_timeout         90;
                proxy_read_timeout         90;
                proxy_buffer_size          4k;
                proxy_buffers              4 32k;
                proxy_busy_buffers_size    64k;
                proxy_temp_file_write_size 10m;
                proxy_cache_key $host$scheme$proxy_host$uri$is_args$args;
                proxy_cache_valid  200 302 304 10m;
                proxy_cache_valid  301 1h;
                proxy_cache_valid  any 1m;
        }
    }
}

shamus24
() автор топика

Есть что-то интересное в /var/log/messages, /var/log/nginx/error.log, dmesg ? Не переполняется ли conntrack ?

fjoe
()

Что-то у тебя где-то очень и очень сломано.

Вот сейчас погонял у себя на виртуалке с убунтой 12.04 с соседнего железного хоста по линку 1гбит:

Server Software:        nginx/1.2.8
Server Hostname:        domain.net
Server Port:            80

Document Path:          /schema.png
Document Length:        41675 bytes

Concurrency Level:      2
Time taken for tests:   116.656 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      4188700000 bytes
HTML transferred:       4167500000 bytes
Requests per second:    857.22 [#/sec] (mean)
Time per request:       2.333 [ms] (mean)
Time per request:       1.167 [ms] (mean, across all concurrent requests)
Transfer rate:          35064.73 [Kbytes/sec] received

Это при том что и там и там достаточно большая нагрузка имеется. Если всё освободить будет больше процентов на 50 я думаю.

Не очень понятно как ты тестировал, опиши подробнее.

blind_oracle ★★★★★
()

nginx в роли реверс-прокси с кэшированием, установленный перед тяжелым django-приложением, тянет что-то около 170 хитов в секунду с пиками до 500, на 5-ой центоси. Чини свой линукс.

leave ★★★★★
()
Ответ на: комментарий от shamus24

Я бы посмотрел на загрузку дисковой подсистемы. Нехватка буферов приводит к высокому i/o и падению производительности.

vel ★★★★★
()

Событийная система nginx основанная на использовании epoll в Linux и kqueue в FreeBSD.

ChAnton ★★
()

Исследование показало, что под FreeBSD запросы с nginx на backend идут с частотой примерно раз в 10 секунд, а под линуксом - сплошным потоком, т.е. кэширование просто не работает, или работает плохо. Почему так - буду выяснять, но, по крайней мере, ясно, что виноват не линукс. Странно, конечно, учитывая, что изначально конфигурация просто скопирована.

Пара замечаний по ответам: 1. Тестировал через CloudFlare (у меня есть там учетка) 2. Загрузка дисковой подсистемы не предполагается - какая там может быть дисковая активность, когда один файл отдаётся? Машина выделенная и ничем другим не загружена. 3. Про epoll в курсе - включил сразу же.

shamus24
() автор топика
Ответ на: комментарий от shamus24

Два наиглупейших вопроса.

1 - бэкенд то где ? На той же машине или нет ? 2 - время, дата на машинах с фронтендом и бэкендом совпадает ?

anonymous
()
Ответ на: комментарий от anonymous

1 - бэкенд то где ? На той же машине или нет ?

Нет, на другой. Её вообще не трогали во время экспериментов с разными nginx-ами.

2 - время, дата на машинах с фронтендом и бэкендом совпадает?

Специально не проверял, но ntp включен везде. Сейчас я уже дома, но потом проверю.

shamus24
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.