এনজিআইএনএক্স +200 সমবর্তী সংযোগের পরে টাইমআউট


12

এটি আমার nginx.conf(কোনও পিএইচপি জড়িত বা অন্য কোনও বাধা নেই তা নিশ্চিত করার জন্য আমি কনফিগার আপডেট করেছি):

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      

সুতরাং এটি সার্ভার রিসোর্স ইস্যু নয়। এটা কি হয় তারপর?

আপডেট ২০১১ 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

এনবি এটি এনগিনেক্স কনফিগারারে worker_rlimit_nofileসেট করা আছে 10240

আপডেট ২০১১ 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;
}

আপডেট ২০১১ 12 11 GMT 20:11।

এটি netstat -ntlaপরীক্ষার সময় আউটপুট ।

https://gist.github.com/d74750cceba4d08668ea

আপডেট ২০১১ 12 12 GMT 10:54।

কেবল পরিষ্কার করার জন্য, iptablesপরীক্ষার সময় (ফায়ারওয়াল) বন্ধ রয়েছে।

আপডেট ২০১১ 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

আপডেট ২০১১ 12 12 GMT 22:49

আমি blitz.ioসমস্ত পরীক্ষা চালাতে ব্যবহার করছি । আমি যে ইউআরএলটি পরীক্ষা করছি তা হ'ল http://dev.anury.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

আপনি নিজেই এটি হোস্ট করছেন? সার্ভারের সামনে কোনও লোড ব্যালান্সার বা এর মতো কিছু নেই? আইএসপি থেকে এমন কিছু যা এটি ডিডিওএস আক্রমণ হিসাবে সনাক্ত করতে পারে এবং এটি র‌্যাম্পে নামিয়ে দিতে পারে?
বার্ট সিলভারস্ট্রিম

হ্যাঁ, এটি আমার সার্ভার। ovh.co.uk/dedided_servers/eg_ssd.xml এমন কোনও কিছুই যা ডিডোএস আক্রমণকে র‌্যাম্প করবে না। আমিও বাড়িয়েছি worker_processesকরতে 4
গাজুস

আমার সার্ভারে কোনও নেটওয়ার্ক স্তরের সিকিওরিটিগুলি প্রয়োগ করা হয়নি তা দ্বিগুণ পরীক্ষা করতে কেবল ওভিএইচ-এর সাথে যোগাযোগ করেছেন। না নেই।
গাজুস

আপনি এটি থেকে কি ধরণের ডেটা পরিবেশন করছেন? এইচটিএমএল, ছবি ইত্যাদি?
পাবলো

1
আমি মনে করি এটি এনজিএনএক্স কনফিগারেশন বাতিল করতে স্থানীয় একটি বেঞ্চমার্ক চালাতে সহায়তা করবে। আপনি না?
3molo

উত্তর:


2

পরীক্ষার সময় আপনার নেটওয়ার্ক সংযোগগুলি ডাম্প করতে হবে। সার্ভারের শূন্যের লোডের কাছাকাছি থাকতে পারে, আপনার টিসিপি / আইপি স্ট্যাকটি বিলিং হতে পারে। নেটস্যাট আউটপুটটিতে TIME_WAIT সংযোগগুলি অনুসন্ধান করুন।

যদি এটি হয় তবে আপনি টিসিপি ওয়েট স্টেটস, টিসিপি পুনর্ব্যবহারযোগ্য এবং অনুরূপ মেট্রিক সম্পর্কিত টিসিপি / আইপি কার্নেল প্যারামিটারগুলি টিউন করতে চান।

এছাড়াও, আপনি যা পরীক্ষা করা হচ্ছে তা বর্ণনা করেন নি।

আমি সবসময় পরীক্ষা:

  • স্থির সামগ্রী (চিত্র বা পাঠ্য ফাইল)
  • সাধারণ পিএইচপি পৃষ্ঠা (উদাহরণস্বরূপ phpinfo)
  • অ্যাপ্লিকেশন পৃষ্ঠা

এটি আপনার ক্ষেত্রে প্রযোজ্য নাও হতে পারে তবে পারফরম্যান্স টেস্ট করার সময় আমি এটি করি। বিভিন্ন ধরণের ফাইল পরীক্ষা করা আপনাকে বাটলনেকটি চিহ্নিত করতে সহায়তা করতে পারে।

স্থির সামগ্রী সহ, টাইমআউট এবং অন্যান্য মেট্রিকগুলি ডায়াল করার জন্য বিভিন্ন আকারের ফাইলের পরীক্ষা করাও গুরুত্বপূর্ণ।

আমাদের কাছে 3000+ সক্রিয় সংযোগগুলি পরিচালনা করে কিছু স্থির সামগ্রী Nginx বাক্স রয়েছে। সুতরাং এটি Nginx অবশ্যই এটি করতে পারেন।

আপডেট: আপনার নেটস্যাট অনেকগুলি মুক্ত সংযোগ দেখায়। আপনার টিসিপি / আইপি স্ট্যাকটি সুর করার চেষ্টা করতে পারে। এছাড়াও, আপনি কোন ফাইলের জন্য অনুরোধ করছেন? Nginx দ্রুত বন্দর বন্ধ করা উচিত।

সিসট্যাকল.কনফের জন্য এখানে একটি পরামর্শ রয়েছে:

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

এই মানগুলি খুব কম তবে আমি তাদের সাথে উচ্চ সম্মতিযুক্ত Nginx বাক্সগুলিতে সাফল্য পেয়েছি।


দেখুনUPDATE 2011 12 09 GMT 17:36.
গাজুস

কোডের কারণে মূল উত্তরে আপডেট হয়েছে।
জেফত্রকাইদ

দয়া করে পরীক্ষার সময় সম্পূর্ণ শীর্ষ আউটপুট যুক্ত করুন, কেবলমাত্র সিপিইউ এনগিনেক্স কতটা ব্যবহার করছে তা পরীক্ষা করা উচিত নয়।
জিয়োভানি টরাল্ডো

1
নেট.আইপিভি 4.টিসিপি_টিউ_রিচালিক = 1 ব্যবহার করার সময় সতর্ক থাকুন: সাধারণত বলছেন: ভাল ধারণা নয়। পুনঃব্যবহার ঠিক আছে।
বেনামে-এক

লোকালহোস্টের পরিবর্তে লিনাক্স সকেট ব্যবহার করবেন না কেন?
বিগস্যাক

1

তবুও আরেকটি অনুমান। আপনি বৃদ্ধি পেয়েছেন worker_rlimit_nofile, তবে ক্লায়েন্টের সর্বাধিক সংখ্যা ডকুমেন্টেশনে হিসাবে সংজ্ঞায়িত হয়েছে

max_clients = worker_processes * worker_connections

আপনি যদি worker_connections8192 এর মতো বাড়ানোর চেষ্টা করেন তবে ? বা, পর্যাপ্ত সিপিইউ কোর থাকলে বাড়বে worker_processes?


1

অ্যাপাচি সার্ভারের একটি প্রবাহের সাথে ভারী ভারসাম্য হিসাবে পরিবেশন করা একটি এনজিনেক্স বক্স নিয়ে আমার খুব অনুরূপ সমস্যা ছিল।

আমার ক্ষেত্রে আপস্ট্রিম অ্যাপাচি সার্ভারগুলি ওভারলোড হয়ে যাওয়ার কারণে নেটওয়ার্কিং সম্পর্কিত সমস্যাটি আমি আলাদা করতে সক্ষম হয়েছি। সামগ্রিক সিস্টেমটি লোডের সময়ে আমি সাধারণ ব্যাশ স্ক্রিপ্টগুলি দিয়ে এটি পুনরায় তৈরি করতে পারতাম। একটি স্তব্ধ প্রক্রিয়া অনুসারে সংযোগ কলটি একটি ETIMEDOUT পাচ্ছিল।

এই সেটিংস (এনগিনেক্স এবং আপস্ট্রিম সার্ভারগুলিতে) আমার জন্য সমস্যাটি দূর করেছে। আমি এই পরিবর্তনগুলি করার আগে প্রতি মিনিটে 1 বা 2 টাইমআউট পাচ্ছিলাম (বাক্সগুলি হ'ল ~ 100 রেখা / গুলি) এবং এখন 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

আমি নেট.আইপিভি 4.টিসিপি_টিউ_সাইকেল বা নেট.ipv4.tcp_tw_reuse ব্যবহার করার পরামর্শ দিচ্ছি না, তবে আপনি যদি ব্যবহার করতে চান তবে পরবর্তীগুলির সাথে যান। এগুলিতে উদ্ভট সমস্যা সৃষ্টি করতে পারে যদি কোনও ধরণের বিলম্ব থাকে তবে এবং পরে অন্তত দু'জনের মধ্যে নিরাপদ is

আমি মনে করি উপরের দিকে tcp_fin_Timeout সেট করা কিছু সমস্যাও হতে পারে। এটি ডিফল্টর থেকে অনেক নিচে - 20/30 এ স্থাপন করার চেষ্টা করুন।


0

আপনি ব্লিটজ.আইও ডু তে পরীক্ষা করার সময় সম্ভবত এনজিনেক্স সমস্যা নয়:

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

(পিএইচপি হ্যান্ডেল করতে আমি যা ব্যবহার করছি তা বোঝায়)

এটি একটি ত্রুটি ঘটায় এবং সময়সীমা উত্থাপন শুরু করে:

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

সুতরাং, fmp কনফেয়ারের উপর আরও ম্যাক্স_চিল্ডেন রাখুন এবং এটি সম্পন্ন হয়েছে! ; ডি


return 200 "test"এনজিআইএনএক্সে থাকলে সমস্যাটি একই । এর অর্থ হ'ল এনজিআইএনএক্স এমনকি পিএইচপি-এফপিএম কল করতে পারে না।
গাজুস

0

আপনার খুব কম max open files(1024), পরিবর্তন চেষ্টা করুন এবং এনজিনেক্স পুনরায় চালু করুন। ( cat /proc/<nginx>/limitsনিশ্চিত করতে)

ulimit -n 10240

এবং বৃদ্ধি worker_connections10240 বা তারও বেশি।


আমি নিশ্চিত নই কেন এটি কেন ভোট পড়েছে। আমার কাছে সঠিক উত্তর বলে মনে হচ্ছে।
রায়ান অ্যাঞ্জিলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.