Назад | Перейти на главную страницу

Сайт nginx + php-fcgi загружается 4-5 секунд, медленная проблема

Мой сайт начал загружаться примерно 4-5 секунд (в часы пик) - его почти не использовать. Трафик: 40 МБ / с на выходе, 6 МБ / с на входе (почти 95% исходящего приходится на файлы размером 0,5–2 ГБ). Более 100 одновременных подключений. Машина работает нормально и отвечает без проблем, я загружаю через веб-сайт очень медленно, около 50 КБ / с и загружаю 50 КБ / с, в то время как через FTP все в порядке, и уходит сотни КБ / с вниз и вверх, поэтому я думаю, что проблема может быть быть где-нибудь в конфигурации nginx, php-fpm или mysql. Но на самом деле я не знаю, как отладить эту проблему. Я погуглил и увеличил значения, чтобы одновременно обслуживать тысячи клиентов, но проблема все та же.

netstat -na |grep :80 |wc -l
250 //if it is something like 150 AND

netstat -an | grep 80 | grep ESTA | wc
150 //this is less than 100, then it is okay, otherwise website is loading 3 times longer than usually

nginx.conf:

user www-data;

worker_processes 8;
pid /var/run/nginx.pid;

worker_rlimit_nofile 200000;

events {
        worker_connections 32768;
        multi_accept on;
        use epoll;
}

http {
        access_log off;

        limit_conn_zone $binary_remote_addr zone=conn:10m;
        #limit_req_zone $binary_remote_addr zone=req:10m rate=250r/s;
        #limit_req zone=req burst=20 nodelay;

        upload_progress uploads 5m;
        upload_progress_json_output;


        sendfile on;
        send_timeout 60s;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 20;
        client_max_body_size 10G;
        client_body_buffer_size 256k;
        types_hash_max_size 2048;
        server_tokens off;

        proxy_buffer_size   128k;
        proxy_buffers   4 256k;
        proxy_busy_buffers_size   256k;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        #access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log crit;

        gzip on;
        gzip_disable "msie6";

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

mysite-virtual.conf

        location ~ \.php$ {
          #limit_req zone=req;
          fastcgi_buffer_size 128k;
          fastcgi_busy_buffers_size 256k;
          fastcgi_buffers 256 16k;
          fastcgi_pass   127.0.0.1:9000;
          fastcgi_temp_file_write_size 256k;
          include fastcgi_params;
        }

/etc/php5/fpm/pool.d/www.conf

pm = dynamic
pm.max_children = 50
pm.start_servers = 25
pm.min_spare_servers = 25
pm.max_spare_servers = 50

Настройка sysctl

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_congestion_control = cubic

ограничение на количество файлов

root        hard    nofile  40000
root        soft    nofile  40000
www-data    hard    nofile  40000
www-data    soft    nofile  40000

Mysql status - прерванные соединения?

Connections ø per hour  %
max. concurrent connections 25  --- ---
Failed attempts 0   0.00    0.00%
Aborted 21  4.19    0.08%
Total   25 k    5,040.80    100.00%

В часы пик, когда веб-страница загружается в течение нескольких секунд, это можно отслеживать в Mytop или Phpmyadmin: Copying to tmp table, поэтому я увеличил tmp_table_size и max_heap_table_size

Пожалуйста, дайте мне несколько советов, где может быть узкое место, потому что я заблудился. Это мой первый сервер в такой конфигурации и, возможно, я мог забыть что-то настроить.

Nginx 1.2.1, php5-fpm

Debian 7.1 Wheezy

2x L5420 @ 2,50 ГГц

8 ГБ оперативной памяти

Решено! Все было в MySQL (проблемы с запросами -> отсутствие индексов (запросы в 20 раз медленнее).

ОБНОВИТЬ:

Пришлось настроить Read-Ahead в Linux для увеличения пропускной способности. От 256 (по умолчанию) до 16384.

blockdev --setra 16384 /dev/sda

После этой операции скорость чтения увеличилась с 40 Мбит / с до 260 Мбит / с, и я наблюдал в MRTG, что исходящий трафик увеличился почти вдвое. Таким образом, запрошенный трафик (раньше) не мог обслуживаться жестким диском, и это было узким местом ввода-вывода, веб-сайт загружался в течение нескольких секунд!