NGINX टाइमआउट +200 समवर्ती कनेक्शन के बाद


12

यह मेरा है nginx.conf(मैंने यह सुनिश्चित करने के लिए कॉन्फ़िगर किया है कि कोई PHP शामिल नहीं है या कोई अन्य अड़चन है))

user                nginx;
worker_processes    4;
worker_rlimit_nofile 10240;

pid                 /var/run/nginx.pid;

events
{
    worker_connections  1024;
}

http
{
    include             /etc/nginx/mime.types;

    error_log           /var/www/log/nginx_errors.log warn;

    port_in_redirect    off;
    server_tokens       off;
    sendfile            on;
    gzip                on;

    client_max_body_size 200M;

    map $scheme $php_https { default off; https on; }

    index index.php;

    client_body_timeout   60;
    client_header_timeout 60;
    keepalive_timeout     60 60;
    send_timeout          60;

    server
    {
        server_name dev.anuary.com;

        root        "/var/www/virtualhosts/dev.anuary.com";
    }
}

मैं अपने सर्वर का परीक्षण करने के लिए http://blitz.io/play का उपयोग कर रहा हूं (मैंने 10 000 समवर्ती कनेक्शन योजना खरीदी)। 30 सेकंड के रन में, मुझे 964हिट्स मिलते हैं और 5,587 timeouts। पहला समयावधि 40.77 सेकंड में परीक्षण में हुआ जब समवर्ती उपयोगकर्ताओं की संख्या 200 पर थी।

परीक्षण के दौरान, सर्वर लोड था ( topआउटपुट):

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               20225 nginx     20   0 48140 6248 1672 S 16.0  0.0   0:21.68 nginx                                                                  
    1 root      20   0 19112 1444 1180 S  0.0  0.0   0:02.37 init                                                                   
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                                                               
    3 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 migration/0      

इसलिए यह सर्वर संसाधन समस्या नहीं है। तो यह क्या है?

अद्यतन 2011 12 09 GMT 17:36।

अब तक मैंने यह सुनिश्चित करने के लिए निम्नलिखित बदलाव किए थे कि टोंटी टीसीपी / आईपी नहीं है। इसमें जोड़ा गया /etc/sysctl.conf:

# These ensure that TIME_WAIT ports either get reused or closed fast.
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_tw_recycle = 1
# TCP memory
net.core.rmem_max = 16777216
net.core.rmem_default = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 4096

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

कुछ और डीबग जानकारी:

[root@server node]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 126767
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

NB जो nginx config पर worker_rlimit_nofileसेट है 10240

अद्यतन 2011 12 09 GMT 19:02।

ऐसा लगता है कि मैं जितना अधिक बदलाव करता हूं, यह उतना ही खराब होता जाता है, लेकिन यहां नई कॉन्फ़िगरेशन फ़ाइल है।

user                nginx;
worker_processes    4;
worker_rlimit_nofile 10240;

pid                 /var/run/nginx.pid;

events
{
    worker_connections  2048;
    #1,353 hits, 2,751 timeouts, 72 errors - Bummer. Try again?
    #1,408 hits, 2,727 timeouts - Maybe you should increase the timeout?
}

http
{
    include             /etc/nginx/mime.types;

    error_log           /var/www/log/nginx_errors.log warn; 

    # http://blog.martinfjordvald.com/2011/04/optimizing-nginx-for-high-traffic-loads/
    access_log              off;

    open_file_cache         max=1000;
    open_file_cache_valid   30s;

    client_body_buffer_size 10M;
    client_max_body_size    200M;

    proxy_buffers           256 4k;
    fastcgi_buffers         256 4k;

    keepalive_timeout       15 15;

    client_body_timeout     60;
    client_header_timeout   60;

    send_timeout            60;

    port_in_redirect        off;
    server_tokens           off;
    sendfile                on;

    gzip                    on;
    gzip_buffers            256 4k;
    gzip_comp_level         5;
    gzip_disable            "msie6";



    map $scheme $php_https { default off; https on; }

    index index.php;



    server
    {
        server_name ~^www\.(?P<domain>.+);
        rewrite     ^ $scheme://$domain$request_uri? permanent;
    }

    include /etc/nginx/conf.d/virtual.conf;
}

अद्यतन 2011 12 11 GMT 20:11।

यह netstat -ntlaपरीक्षण के दौरान आउटपुट है ।

https://gist.github.com/d74750cceba4d08668ea

अद्यतन 2011 12 12 GMT 10:54।

iptablesपरीक्षण करते समय (फायरवॉल) स्पष्ट करने के लिए बस ।

अद्यतन 2011 12 12 GMT 22:47।

यह sysctl -p | grep memडंप है।

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 8388608 8388608 8388608
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 65536 8388608
net.ipv4.route.flush = 1
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_max = 8388608
net.core.wmem_default = 65536
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 4096
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

अद्यतन 2011 12 12 GMT 22:49

मैं blitz.ioसभी परीक्षण चलाने के लिए उपयोग कर रहा हूं । निम्नांकित कमांड का उपयोग करते हुए मैं जिस URL का परीक्षण कर रहा हूं वह http://dev.anuge.com/test.txt है :--region ireland --pattern 200-250:30 -T 1000 http://dev.anuary.com/test.txt

अद्यतन 2011 12 13 GMT 13:33

nginxउपयोगकर्ता सीमाएँ (सेट में /etc/security/limits.conf)।

nginx       hard nofile 40000
nginx       soft nofile 40000

आप स्वयं इसकी मेजबानी कर रहे हैं? सर्वर के सामने कोई लोड balancers या ऐसा कुछ नहीं? ISP से कुछ जो इसे DDoS हमले के रूप में पहचान सकता है और इसे नीचे गिरा सकता है?
बार्ट सिल्वरस्ट्रिम

हाँ, यह मेरा सर्वर है। ovh.co.uk/dedicated_servers/eg_ssd.xml कुछ भी नहीं है जो DDoS के हमले को कम करेगा। मैं भी बढ़ा दिया है worker_processesकरने के लिए 4
गजस

OVH से डबल चेक करने के लिए संपर्क करें कि मेरे सर्वर पर कोई नेटवर्क स्तर की प्रतिभूतियाँ लागू नहीं हैं। नहीं, वहाँ नहीं हैं।
गजस

आप इससे किस तरह का डेटा परोस रहे हैं? html, चित्र, आदि?
पाब्लो

1
मुझे लगता है कि यह नगनेक्स कॉन्फ़िगरेशन को नियंत्रित करने के लिए एक स्थानीय बेंचमार्क चलाने में मदद करेगा। क्या तुम नहीं?
3molo

जवाबों:


2

आपको परीक्षण के दौरान अपने नेटवर्क कनेक्शन को डंप करना होगा। जबकि सर्वर शून्य लोड के पास हो सकता है, आपका टीसीपी / आईपी स्टैक बिलिंग हो सकता है। एक netstat आउटपुट में TIME_WAIT कनेक्शन खोजें।

यदि यह मामला है, तो आप टीसीपी वेट स्टेट्स, टीसीपी रेकीलिंग और इसी तरह के मेट्रिक्स से संबंधित ट्यूनिंग टीसीपी / आईपी कर्नेल पैरामीटर्स में जांचना चाहेंगे।

इसके अलावा, आपने यह नहीं बताया है कि क्या परीक्षण किया जा रहा है।

मैं हमेशा परीक्षण करता हूं:

  • स्थिर सामग्री (छवि या पाठ फ़ाइल)
  • साधारण php पेज (उदाहरण के लिए phpinfo)
  • आवेदन पृष्ठ

यह आपके मामले में लागू नहीं हो सकता है, लेकिन ऐसा कुछ है जो मैं प्रदर्शन परीक्षण के दौरान करता हूं। विभिन्न प्रकार की फ़ाइलों का परीक्षण आपको टोंटी को इंगित करने में मदद कर सकता है।

स्थैतिक सामग्री के साथ भी, फ़ाइलों के विभिन्न आकार का परीक्षण महत्वपूर्ण है और साथ ही टाइमआउट और अन्य मैट्रिक्स को डायल करने के लिए।

हमारे पास 3000 + सक्रिय कनेक्शन से निपटने के लिए कुछ स्थिर सामग्री नग्नेक्स बॉक्स हैं। तो यह Nginx निश्चित रूप से कर सकता है।

अपडेट: आपका नेटस्टैट बहुत सारे खुले कनेक्शन दिखाता है। अपने टीसीपी / आईपी स्टैक को ट्यून करने का प्रयास कर सकते हैं। इसके अलावा, आप किस फ़ाइल का अनुरोध कर रहे हैं? Nginx को पोर्ट को जल्दी से बंद कर देना चाहिए।

यहाँ sysctl.conf के लिए एक सुझाव दिया गया है:

net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

ये मूल्य बहुत कम हैं, लेकिन मुझे उनके साथ उच्च संगामिति नग्नेक्स बॉक्स में सफलता मिली है।


देखिएUPDATE 2011 12 09 GMT 17:36.
गजस

कोड के कारण मुख्य उत्तर में अपडेट किया गया।
जेफ्राट्रैड

कृपया परीक्षण के दौरान पूरा शीर्ष आउटपुट जोड़ें, आपको केवल यह जांचना नहीं चाहिए कि CPU nginx कितना उपयोग कर रहा है।
जियोवानी टोराल्डो

1
net.ipv4.tcp_tw_recycle = 1 का उपयोग करते समय सतर्क रहें, आम तौर पर बोलना: एक अच्छा विचार नहीं है। पुन: उपयोग ठीक है
अनाम-एक

लोकलहोस्ट के बजाय लिनक्स सॉकेट का उपयोग क्यों नहीं किया जाता है?
बिगसैक

1

फिर भी एक और परिकल्पना। आप में वृद्धि हुई है worker_rlimit_nofile, लेकिन ग्राहकों की अधिकतम संख्या है दस्तावेज में परिभाषित के रूप में

max_clients = worker_processes * worker_connections

क्या होगा अगर आप worker_connections8192 को बढ़ाने की कोशिश करते हैं ? या, यदि पर्याप्त सीपीयू कोर है, तो वृद्धि करें worker_processes?


1

मैं एक nginx बॉक्स के साथ अपाचे सर्वर के एक अपस्ट्रीम के साथ लोड बैलेंसर के रूप में सेवारत एक बहुत ही समान समस्या हो रही थी।

मेरे मामले में मैं इस समस्या को अलग करने में सक्षम था, जिससे संबंधित नेटवर्क अपस्ट्रीम अपाचे सर्वर ओवरलोड हो गया। मैं इसे सरल बैश स्क्रिप्ट के साथ फिर से बना सकता था जबकि समग्र प्रणाली लोड के तहत थी। एक त्रिशंकु प्रक्रिया की एक धारा के अनुसार कनेक्ट कॉल को ETIMEDOUT मिल रहा था।

इन सेटिंग्स (नगनेक्स और अपस्ट्रीम सर्वर पर) ने मेरे लिए समस्या को खत्म कर दिया। इन बदलावों को करने से पहले मुझे प्रति मिनट 1 या 2 टाइमआउट मिल रहे थे (बक्से ~ 100 reqs / s) संभाल रहे थे और अब 0 मिलते हैं।

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_max_tw_buckets = 400000
net.core.somaxconn = 4096

मैं net.ipv4.tcp_tw_recycle या net.ipv4.tcp_tw_reuse का उपयोग करने की अनुशंसा नहीं करूंगा, लेकिन यदि आप बाद वाले के साथ एक का उपयोग करना चाहते हैं। यदि किसी प्रकार की विलंबता हो तो वे विचित्र मुद्दों का कारण बन सकते हैं और बाद में कम से कम दोनों का सुरक्षित होना आवश्यक है।

मुझे लगता है कि tcp_fin_timeout को 1 से ऊपर सेट करने से कुछ परेशानी हो सकती है। इसे 20/30 पर रखने की कोशिश करें - अभी भी डिफ़ॉल्ट से काफी नीचे है।


0

हो सकता है कि आप nginx समस्या न हों, जब आप ब्लिट्ज पर परीक्षण करते हैं।

tail -f /var/log/php5-fpm.log

(php को संभालने के लिए मैं जो उपयोग कर रहा हूं, वह है)

इससे एक त्रुटि उत्पन्न होती है और समय समाप्त होने लगते हैं:

WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

इसलिए, fmp conf और उसके किए पर अधिक से अधिक max_children डालें! ; D


अगर मैं return 200 "test"NGINX में हूं तो समस्या वही है । इसका मतलब है कि NGINX PHP-FPM को कॉल करने के लिए उतना दूर नहीं जाता है।
गजस

0

आपके पास बहुत कम max open files(1024) हैं, बदलाव की कोशिश करें और नगीनेक्स को पुनरारंभ करें। ( cat /proc/<nginx>/limitsपुष्टि करने के लिए)

ulimit -n 10240

और बढ़कर worker_connections10240 या उससे अधिक हो जाती है।


मुझे यकीन नहीं है कि यह मतदान क्यों किया गया है। मेरे लिए सही उत्तर की तरह लगता है।
रयान एंगली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.