Tuning FreeBSD 7.2 amd64 for high load nginx web server.

Михаил Монашёв postmaster на softsearch.ru
Ср Дек 23 02:10:39 MSK 2009


Здравствуйте, Владимир.

VG> После  чтения  N-го  количества  мануалов, статей и пр. по тюнингу
VG> FreeBSD   для  WEB  все  еще  остались  некоторые  сомнения  из-за
VG> противоречий в вышеописанной мат. части.

VG> В связи с сим, уважаемая публика, имеется просьба.

VG> У кого FreeBSD amd64 под L5420 разшарьте свои
VG> /boot/loader.conf, /etc/sysctl.conf, kldstat (output)

VG> Еще если не затруднит:
VG> cat
VG> /usr/src/sys/amd64/conf/MYSUPERPERFORMANCEKERNELFORNGINXWEBSERVER
VG> :)
VG> cat /usr/local/etc/nginx/nginx.conf

Критика приветствуется :-)

Планирую перейти на GENERIC во FreeBSD 8.0 и потому многое перекочует
оттуда в /boot/loader.conf, например ipfw, акцепт-фильтры, geom, lagg,
vlan .

/boot/loader.conf:
aio_load="YES"

net.inet.tcp.syncache.hashsize="1024"
net.inet.tcp.syncache.bucketlimit="100"
net.inet.tcp.tcbhashsize="4096"

vm.kmem_size="1G"
kern.ipc.nmbclusters="262144"

net.inet.tcp.hostcache.hashsize="16384"
net.inet.tcp.hostcache.bucketlimit="100"

hw.em.rxd="4096"
hw.em.txd="4096"
hw.em.rx_process_limit="-1"

vm.pmap.pg_ps_enabled="1"



/etc/sysctl.conf
# нужно для jumbo frames . смотреть можно через netstat -m : 18192/1733/19925/65536 4k (page size) jumbo clusters in use (current/cache/total/max)
kern.ipc.nmbjumbop=131072

# увеличиваем, чтобы больше мелких файлов влезло в кэш файловой системы
kern.maxvnodes=2000000

# нужно было для варниша
#kern.threads.max_threads_per_proc=100000

net.inet.ip.intr_queue_maxlen=4096

net.inet.tcp.msl=30000
net.inet.tcp.delayed_ack=0

net.inet.ip.random_id=1

net.inet.ip.fw.dyn_buckets=65536
net.inet.ip.fw.dyn_max=65536
net.inet.ip.fw.dyn_ack_lifetime=120
net.inet.ip.fw.dyn_syn_lifetime=10
net.inet.ip.fw.dyn_fin_lifetime=2
net.inet.ip.fw.dyn_short_lifetime=10

net.inet.tcp.keepidle=40000
net.inet.tcp.keepintvl=40000
net.inet.tcp.keepinit=40000

net.inet.tcp.sendspace=131072
net.inet.tcp.recvspace=131072

net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1

# увеличивает количество tcptw для хранения TAIM_WAIT сокетов
net.inet.tcp.maxtcptw=40960

# порты для исходящих соединений начинаются с номера 16384, вместо 49152. Также надо firewall подправить, чтобы он этот интервал портов учитывал
net.inet.ip.portrange.first=1024

# выдавать порты для исходящих соединений последовательно
net.inet.ip.portrange.randomized=0

# не переводить в состояние TAIM_WAIT соединения на локальном сервере
# содержит баги и поэтомц выключено
# net.inet.tcp.nolocaltimewait=1

# разрешаем переключение с syncache на syncookies, если syncache переполнен
net.inet.tcp.syncookies=1

# увеличивает лимиты в vmstat -z для socket, inpcb и tcpcb. можно задрать до 204800, тогда будет сложнее задосить
kern.ipc.maxsockets=204800

# сложнее задосить. kern.maxfiles задрать, а kern.maxfilesperproc не задирать, если реально не требуется.
kern.maxfiles=204800
kern.maxfilesperproc=200000

# нужно чтобы соединения не сбрасывались, если апачи будут тормозить
kern.ipc.somaxconn=4096

# нужно чтобы не падали сообщения вроде: kernel: Limiting open port RST response from 596 to 200 packets/sec
net.inet.icmp.icmplim=2000

debug.minidump=1




/usr/local/etc/nginx/nginx.conf
# на небольшом числе воркеров не включать
#timer_resolution 100ms;

#user  nobody;
#worker_processes       1000;
worker_processes        30;

error_log       /opt/log/nginx/error.log;
#error_log      /opt/log/nginx/error.log  debug;

pid             /var/run/nginx.pid;

events {
        use kqueue;
        worker_connections 2048;
}


http {

        log_format main '$time_local $status "$upstream_status" "$upstream_response_time" "$upstream_addr" $remote_addr $bytes_sent $host "$request" "$http_referer" "$http_user_agent"';

        #log_format webdav  '$host $request';
        #access_log      /opt/log/nginx/access.log       webdav    buffer=256k;
        #access_log      /opt/log/nginx/access.log       main   buffer=256k;
        #access_log      /opt/log/nginx/access.log       main;
        #access_log      /opt/log/nginx/access.log      cache   buffer=256k;
        access_log     off;

        log_not_found           off;

        sendfile                on;
        tcp_nopush              on;
        aio                     sendfile;
        tcp_nodelay             on;
        send_lowat              12000;

        ignore_invalid_headers on;
        server_names_hash_bucket_size 64;

        client_body_temp_path   /var/tmp/nginx/client_body_temp_path;

        client_max_body_size    10m;
        client_body_buffer_size 128k;

        client_header_timeout           3m;
        client_header_buffer_size       2k;
        client_body_timeout                     3m;
        send_timeout                            3m;
        postpone_output                         1460;
        keepalive_timeout                       75 60;

        reset_timedout_connection       on;

        proxy_set_header        Host                                    $host;

        proxy_set_header        X-Real-IP                               $remote_addr;

        proxy_redirect  off;

        proxy_buffers   128     128k;

        proxy_temp_path /var/tmp/nginx/proxy_temp_path;

        proxy_cache_path        /optcache1/cache        levels=1:2      keys_zone=optcache1:200m        inactive=30d    max_size=200G;
        proxy_cache_path        /optcache2/cache        levels=1:2      keys_zone=optcache2:200m        inactive=30d    max_size=200G;
        proxy_cache_path        /optcache3/cache        levels=1:2      keys_zone=optcache3:200m        inactive=30d    max_size=200G;
        proxy_cache_key         $host$uri;
        proxy_cache_valid       200     30d;
        proxy_cache_valid       301 302 404     1s;
        proxy_cache_use_stale   error timeout invalid_header http_500 http_502 http_503 http_504 http_404;

#        set_real_ip_from   10.0.0.0/8;
#        real_ip_header     X-Real-IP;

        types {
                text/html                       html htm shtml;
                text/css                        css;
                text/xml                        xml;
                image/gif                       gif;
                image/jpeg                      jpeg jpg;
                application/x-javascript        js;
                text/plain                      txt;
                image/png                       png;
                image/x-icon                    ico;
                application/x-shockwave-flash   swf;
                audio/mpeg                      mp3;
                application/x-gzip              gz;
        }

        server {
                listen          83.222.4.74:80 default accept_filter=httpready rcvbuf=4096 sndbuf=131072;
                server_name     for.trash.ru;

                location / {
                        return 204;
                }

                location = /nginx_status {
                        stub_status on;
                }
        }
        server {
...
        }
}

--

С уважением,
Михаил Монашёв, SoftSearch.ru
mailto:postmaster at softsearch.ru
ICQ# 166233339
http://michael.mindmix.ru/
Без бэкапа по жизни.




Подробная информация о списке рассылки nginx-ru