লিনাক্স কার্নেল টিউনিং - একটি প্রবাহী ইউনিক্স সকেটে এনগিনেক্স থ্রুপুট বাড়ানো দরকার?


28

আমি একটি এনগিনেক্স সার্ভার চালাচ্ছি যা এই প্রবাহের মতো ইউনিক্স সকেটের প্রক্সি হিসাবে কাজ করে:

upstream app_server {
        server unix:/tmp/app.sock fail_timeout=0;
}

server {
        listen ###.###.###.###;
        server_name whatever.server;
        root /web/root;

        try_files $uri @app;
        location @app {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                proxy_pass http://app_server;
        }
}

কিছু অ্যাপ সার্ভার প্রক্রিয়াগুলি, পরিবর্তে, অনুরোধগুলি /tmp/app.sockউপলভ্য হওয়ার সাথে সাথে টানুন । এখানে ব্যবহৃত বিশেষ অ্যাপ্লিকেশন সার্ভারটি ইউনিকর্ন, তবে আমি মনে করি না যে এটি এই প্রশ্নের সাথে প্রাসঙ্গিক।

সমস্যাটি হ'ল, এটি কেবলমাত্র মনে হয় যে নির্দিষ্ট পরিমাণ লোডের পরে, এনজিঙ্কস দ্রুত পর্যায়ে সকেটের মাধ্যমে অনুরোধগুলি পেতে পারে না। আমি কত অ্যাপ্লিকেশন সার্ভার প্রক্রিয়া সেট আপ করি তা বিবেচ্য নয়।

আমি এই বার্তাগুলির একটি প্লাবন পেয়ে যাচ্ছি এনগিনেক্স ত্রুটি লগতে:

connect() to unix:/tmp/app.sock failed (11: Resource temporarily unavailable) while connecting to upstream

অনেক অনুরোধের স্থিতি কোড 502 ফলাফল হয় এবং সেগুলি সম্পূর্ণ হতে দীর্ঘ সময় নেয় না। এনজিনেক্স রাইনের সারি স্ট্যাট 1000 এর আশেপাশে থাকে।

যাইহোক, আমার মনে হচ্ছে আমি এখানে স্পষ্ট কিছু মিস করছি, কারণ এনজিনেক্স এবং অ্যাপ সার্ভারের এই নির্দিষ্ট কনফিগারেশনটি খুব সাধারণ, বিশেষত ইউনিকর্নের ক্ষেত্রে (এটি বাস্তবে প্রস্তাবিত পদ্ধতি)। এখানে কি কোনও লিনাক্স কার্নেল বিকল্প আছে যা সেট করতে হবে, বা এনজিনেক্সে কিছু আছে? আপস্ট্রিম সকেটে কীভাবে থ্রুপুট বাড়ানো যায় সে সম্পর্কে কোনও ধারণা? এমন কিছু যা আমি স্পষ্টত ভুল করছি?

পরিবেশ সম্পর্কিত অতিরিক্ত তথ্য:

$ uname -a
Linux servername 2.6.35-32-server #67-Ubuntu SMP Mon Mar 5 21:13:25 UTC 2012 x86_64 GNU/Linux

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

$ unicorn -v
unicorn v4.3.1

$ nginx -V
nginx version: nginx/1.2.1
built by gcc 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
TLS SNI support enabled

বর্তমান কার্নেল টুইটগুলি:

net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 16777216 16777216 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.route.flush = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.somaxconn = 8192
net.netfilter.nf_conntrack_max = 524288

Nginx ব্যবহারকারীর জন্য সেটিংস বাতিল করুন:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

আপনি কি ulimitবিশেষত খোলার ফাইলের আউটপুট পরীক্ষা করেছেন ?
খালেদ

@ খালেদ, ulimit -nবলেছেন 65535
বেন লি

উত্তর:


16

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

আপনি sysctl.conf সংযোগ ট্র্যাকিং সীমা, সকেট ব্যাকলগ সীমা পরীক্ষা করেছেন

  • net.core.somaxconn
  • net.core.netdev_max_backlog

2
আমি সমস্যাটি বুঝতে পেরেছি। আমি পোস্ট করা উত্তর দেখুন। এটা আসলে ছিল , অ্যাপ্লিকেশন bottlenecking না সকেট ঠিক যেমন আপনি সত্য বলিয়া মানিয়া লওয়া। একটি ভুল নির্ণয়ের কারণে আমি আগেই এটিকে বাতিল করে দিয়েছিলাম তবে সমস্যাটি অন্য সার্ভারে থ্রুপুট হয়ে গেছে। মাত্র কয়েক ঘন্টা আগে এটি বের করা হয়েছে। আমি আপনাকে অনুগ্রহ প্রদান করতে যাচ্ছি, যেহেতু আমি ভুলভাবে রোগ নির্ণয় করার পরেও আপনি সমস্যার উত্সটিকে পেরেক দিয়েছিলেন; যাইহোক, আমার উত্তরে চেকমার্কটি দিতে যাচ্ছি, কারণ আমার উত্তরটি সঠিক পরিস্থিতিতে বর্ণনা করে তাই ভবিষ্যতে কাউকে অনুরূপ সমস্যা নিয়ে সহায়তা করতে পারে।
বেন লি

পর্যাপ্ত থ্রুপুট সরবরাহ করতে, সিস্টেমটিকে সম্পূর্ণ পুনর্নির্মাণ করতে এবং এখনও একই সমস্যা রয়েছে এমন জায়গায় একটি নতুন সার্ভার স্থানান্তরিত হয়েছে। সুতরাং দেখা যাচ্ছে যে আমার সমস্যাটি সমাধান হয়ে গেছে সর্বোপরি ... = (আমি এখনও এটি অ্যাপ-নির্দিষ্ট বলে মনে করি তবে কিছুই ভাবতে পারি না This নতুন সার্ভারটি ঠিক ঠিক অন্য সার্ভারের মতো সেট আপ করা হয়েছে যেখানে এটি ঠিকঠাক কাজ করছে Yes হ্যাঁ, সোম্যাক্সন এবং নেটদেব_ম্যাক্স_ব্যাকলগ সঠিকভাবে আপ।
বেন লি

আপনার সমস্যাটি এনজিন্স নয়, এটি সক্ষমের চেয়েও বেশি - তবে এটি সম্ভবত এটি বলার অপেক্ষা রাখে না যে আপনার কাছে দুর্বৃত্ত সেটিংস নাও থাকতে পারে। সকেটগুলি উচ্চ লোডের অধীনে বিশেষত সংবেদনশীল যখন সীমাটি সঠিকভাবে কনফিগার করা হয় না। আপনি কি এর পরিবর্তে টিসিপি / আইপি দিয়ে আপনার অ্যাপটি চেষ্টা করতে পারেন?
বেন লেসানী - সোনাসি

tcp / ip ব্যবহার করে এমনকি আরও খারাপ মাত্রার সাথে একই সমস্যা (লেখার সারিটি আরও দ্রুত আরোহণ করে)। আমার কাছে এনজিন্স / ইউনিকর্ন / কার্নেল সমস্ত আলাদা মেশিনে হুবহু একই (যতদূর আমি বলতে পারি) সেট আপ করেছি এবং অন্য যন্ত্রটি এই সমস্যাটি প্রদর্শন করছে না। (আমি লাইভ লোড পরীক্ষার জন্য দুটি মেশিনের মধ্যে ডিএনএস স্যুইচ করতে পারি এবং 60 সেকেন্ডের টিটিএলতে ডিএনএস রাখতে পারি)
বেন লি

প্রতিটি মেশিন এবং একটি ডিবি মেশিনের মধ্যে থ্রুপুট এখন একই এবং নতুন মেশিন এবং ডিবি মেশিনের মধ্যে বিলম্বতা পুরানো মেশিন এবং ডিবির তুলনায় প্রায় 30% বেশি। তবে 30% বেশি যে মিলিসেকেন্ডের দশমাংশ সমস্যা নয়।
বেন লি

2

আপনি তাকানোর চেষ্টা করতে unix_dgram_qlenপারেন, ডকগুলি দেখুন । যদিও কিউটিতে আরও নির্দেশ করে সমস্যাটি আরও জটিল করে তুলতে পারে? আপনাকে দেখতে হবে (নেটস্ট্যাট-এক্স ...)


এ নিয়ে কোন অগ্রগতি?
jmw

1
ধারণার জন্য ধন্যবাদ, তবে এটি কোনও তাত্পর্যপূর্ণ বলে মনে হয় নি।
বেন লি

0

আমি কনফিগারেশনে / ইউনিকর্ন.আরবি ব্যাকলগ নম্বর বাড়িয়ে সমাধান করেছি ... আমার ব্যাকলগ 64৪ ছিল।

 listen "/path/tmp/sockets/manager_rails.sock", backlog: 64

এবং আমি এই ত্রুটি পেয়েছিলাম:

 2014/11/11 15:24:09 [error] 12113#0: *400 connect() to unix:/path/tmp/sockets/manager_rails.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 192.168.101.39, server: , request: "GET /welcome HTTP/1.0", upstream: "http://unix:/path/tmp/sockets/manager_rails.sock:/welcome", host: "192.168.101.93:3000"

এখন, আমি বাড়িয়ে 1024 করেছি এবং আমি ত্রুটিটি পাই না:

 listen "/path/tmp/sockets/manager_rails.sock", backlog: 1024

0

TL; ড

  1. ইউনিকর্ন ব্যাকলগটি বড় কিনা তা নিশ্চিত করুন (সকেট ব্যবহার করুন, টিসিপির চেয়ে দ্রুত) listen("/var/www/unicorn.sock", backlog: 1024)
  2. উদাহরণস্বরূপ, এনজিআইএনএক্স কর্মক্ষমতা সেটিংস অনুকূলিত করুনworker_connections 10000;

আলোচনা

আমাদের একই সমস্যা ছিল - এনজিআইএনএক্স বিপরীত প্রক্সিটির পিছনে ইউনিকর্ন দ্বারা সরবরাহ করা একটি রেলস অ্যাপ্লিকেশন।

আমরা এনগিনেক্স ত্রুটি লগের মতো লাইন পাচ্ছিলাম:

2019/01/29 15:54:37 [error] 3999#3999: *846 connect() to unix:/../unicorn.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: xx.xx.xx.xx, request: "GET / HTTP/1.1"

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

nginx.confএই পারফরম্যান্স টিউনিং নিবন্ধে টুইটারে এনজিআইএনএক্স সেটিংস সন্ধান করা বেশ কয়েকটি সেটিংস নির্দেশ করেছে যা এনজিআইএনএক্স কতগুলি সমান্তরাল অনুরোধগুলি প্রক্রিয়া করতে পারে তার উপর প্রভাব ফেলতে পারে, বিশেষত:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
worker_rlimit_nofile 400000; # important

events {    
  worker_connections 10000; # important
  use epoll; # important
  multi_accept on; # important
}

http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  keepalive_requests 100000; # important
  server_names_hash_bucket_size 256;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  gzip on;
  gzip_disable "msie6";
  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}

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