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