লিনাক্স সার্ভারে সংযোগের সর্বাধিক সংখ্যাকে কী সীমাবদ্ধ করে?


89

কোন কর্নেল প্যারামিটার বা অন্যান্য সেটিংস লিনাক্স সার্ভারে খোলা যেতে পারে এমন সর্বাধিক সংখ্যক টিসিপি সকেট নিয়ন্ত্রণ করে? আরও সংযোগের অনুমতি দেওয়ার ট্রেড অফগুলি কী কী?

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

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

এখানে আমার পরীক্ষার ফলাফল:

# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed

পরীক্ষার সময় আমি চালাচ্ছি নেটস্প্যাট কমান্ডটি:

 # netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c 
  11651 tcp 0 0 localhost:www TIME_WAIT -
      1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab

উত্তর:


64

পরিশেষে আমি সেটিং যে সত্যিই সংযোগ সংখ্যা সীমিত ছিল পাওয়া গেছে: net.ipv4.netfilter.ip_conntrack_max। এটি 11,776 এ সেট করা হয়েছিল এবং আমি যা কিছু সেট করেছি সেটি হ'ল tcp_fin_timeoutআরও সংযোগ উপলভ্য হওয়ার জন্য কয়েক সেকেন্ড অপেক্ষা করার আগে আমি আমার পরীক্ষায় যে অনুরোধগুলি পরিবেশন করতে পারি । conntrackটেবিল কি কার্নেল তাই একবার এটি পূর্ণ হয়, কার্নেল প্যাকেট ড্রপ এবং লগ এই মুদ্রণ শুরু হয় সংযোগের রাষ্ট্র ট্র্যাক করতে ব্যবহার হয়:

Jun  2 20:39:14 XXXX-XXX kernel: ip_conntrack: table full, dropping packet.

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

এই কনফিগারেশনটি দিয়ে আমি সারা দিন আব চালাতে পারি এবং কখনও সংযোগের বাইরে চলে যাব না:

net.ipv4.netfilter.ip_conntrack_max = 32768
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768    61000

tcp_max_orphansসেটিং আমার পরীক্ষার কোনো প্রভাব ছিল না এবং আমি জানি না কেন। আমি মনে করি TIME_WAITএটিগুলির মধ্যে 8192 একবার থাকলে এটি রাজ্যে সংযোগগুলি বন্ধ করে দেবে তবে এটি আমার জন্য তা করে না।


3
আমরা এই প্যারামগুলি কোথায় কনফিগার করব?
কোডভেলি

2
@ কোডভলে এগুলি সিস্টেম নির্ভর হতে পারে তবে উবুন্টু সার্ভারে তারা /etc/sysctl.conf এ যান
বেন উইলিয়ামস

24

আপনি / প্রকৃত ফাইল সিস্টেমটি আপনাকে এই বিষয়ে কী প্রস্তাব দিচ্ছে তা সত্যই আপনি দেখতে চান।

শেষ পৃষ্ঠায়, আপনি নিম্নলিখিতটি আগ্রহী বলে মনে করতে পারেন:

  • / proc / sys / নেট / IPv4 / tcp_max_orphans , যা সিস্টেম দ্বারা অনুষ্ঠিত সকেট সর্বোচ্চ সংখ্যক নিয়ন্ত্রণ না কিছু সংযুক্ত করা হয়েছে। এটি উত্থাপনে অনাথ সকেটে প্রতি 64 কেবাইট নন-অদল-বদলযোগ্য মেমরি গ্রাস করতে পারে ।
  • / proc / sys / নেট / ipv4 / tcp_orphan_retries , যা কোনও সকেট এতিম ও বন্ধ হওয়ার আগে পুনরায় চেষ্টা করার পরিমাণ নিয়ন্ত্রণ করে। ওয়েব সার্ভারগুলি সম্পর্কে সেই পৃষ্ঠায় একটি নির্দিষ্ট নোট রয়েছে যা আপনার সরাসরি আগ্রহের বিষয় ...

tcp_max_orphans আকর্ষণীয় তবে মনে হচ্ছে এটি কাজ করছে না। আমার পরীক্ষার সময় আমি যখন অনাথ সকেটগুলি পরিমাপ করার চেষ্টা করি তখন আমি তাদের মধ্যে 11,651 টিসিপি দেখতে পাই যখন tcp_max_orphans 8,092। # নেটস্প্যাট --আইনেট-পি | grep "লোকালহোস্ট: www" | sed -e 's / \ + / / g' | কাট-ডি '' -ফ 1-4,6-7 | সাজানো | uniq -c 11651 tcp 0 0 লোকালহোস্ট: www টিআইএমE_WAIT -
বেন উইলিয়ামস

Tcp_orphan_retries সেটিংটি দেখুন - ধারণাটি হচ্ছে, সকেটগুলি দ্রুত "কুলড" করা হয় ...
অ্যাভেরি পেইন

@ জোদার হো এর পরামর্শ + tcp_orphan_retries আপনার পরিস্থিতির সম্ভাবনা জয়ের মত মনে হচ্ছে।
অ্যাভেরি পেইন

3

আমি মনে করি না যে এটি সরাসরি সেট করার জন্য কোনও টিউনেবল আছে। এটি টিসিপি / আইপি টিউনিং বিভাগের অধীনে আসে। আপনি কী টিউন করতে পারেন তা জানতে, 'ম্যান 7 টিসিপি' ব্যবহার করে দেখুন। এগুলি সেট করার জন্য সিস্টেল ('ম্যান 8 সিসেক্টল') ব্যবহার করা হয়। 'sysctl -a | গ্রেপ টিসিপি 'আপনি কী টিউন করতে পারেন তার বেশিরভাগটি আপনাকে দেখাবে, তবে আমি নিশ্চিত নই যে এটি সমস্তগুলি প্রদর্শন করবে কিনা I এছাড়াও, এটি পরিবর্তিত না হলে, টিসিপি / আইপি সকেটগুলি ফাইল বর্ণনাকারীর মতো দেখায়। সুতরাং এটি এবং সেই লিঙ্কটির পরবর্তী বিভাগটি আপনি যা খুঁজছেন তা হতে পারে।


2

Tcp_fin_timeout সেট করার পাশাপাশি নিম্নলিখিতগুলি সেট করার চেষ্টা করুন। এটি আরও দ্রুত TIME_WAIT বন্ধ করা উচিত।

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

সাবধান! হার্ড উপায় অভিজ্ঞ। "এটি লোড-ব্যালেন্সিং এবং NAT এর সাথে বাদ পড়া ফ্রেমগুলির কারণ হতে পারে, এটি কেবলমাত্র আপনার স্থানীয় নেটওয়ার্কের সাথে যোগাযোগ করে এমন একটি সার্ভারের জন্য এটি ব্যবহার করুন" " - wiki.archlinux.org/index.php/Syctl
হেন্ক

@ হেনক আমার ধারণা এটি tcp_tw_recycleসম্ভাব্য বিপদজনক। tcp_tw_reuseনিরাপদ এবং আমি তাদের একই সাথে ব্যবহার করার কোনও কারণ দেখতে পাচ্ছি না।
ভ্লাদিস্লাভ রাস্ট্রুসনি

2

স্টক অ্যাপাচি (1) কেবল 250 সমবর্তী সংযোগগুলি সমর্থন করার জন্য পূর্বনির্ধারিত আসত - আপনি যদি আরও চান তবে আরও একত্রে সেশনগুলি অনুমোদনের জন্য সংশোধন করার জন্য একটি শিরোনাম ফাইল ছিল। অ্যাপাচি 2 এর সাথে এটি এখনও সত্য কিনা জানি না।

এছাড়াও, আপনাকে অ্যাপাচি চালিত অ্যাকাউন্টের জন্য আরও বেশি ওপেন ফাইল বর্ণনাকারীর বোঝার অনুমতি দেওয়ার জন্য একটি বিকল্প যুক্ত করতে হবে - এমন কিছু যা পূর্ববর্তী মন্তব্যগুলি উল্লেখ করতে ব্যর্থ।

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


1

আপনি TIME_WAIT অবস্থায় কাটানো সময়টি হ্রাস করতে পারেন (নেট.আইপিভি 4.tcp_fin_Toutout সেট করুন)। আপনি অ্যাপাচি কে YAWS বা nginx বা অনুরূপ কিছু দিয়ে প্রতিস্থাপন করতে পারেন।

আরও সংযোগের ট্রেড অফগুলি সাধারণত মেমরির ব্যবহারের সাথে জড়িত থাকে এবং আপনার যদি একটি কাঁটাচামচ প্রক্রিয়া থাকে তবে প্রচুর পরিমাণে শিশু প্রক্রিয়া যা আপনার সিপিইউ স্য্যাম্প করে।


1
tcp_fin_timeout TIME-WAIT মেয়াদ নির্ধারণের জন্য নয় যা কার্নেলটি পুনর্নির্মাণের বাইরে পরিবর্তনযোগ্য নয়, তবে নামটি সূচিত করে এফআইএন-র জন্য।
আলেকজান্ডার কুরিলিন

0

একক আইপি ঠিকানায় খোলা থাকা সকেটের পরম সংখ্যা 2 ^ 16 এবং কার্নেল নয়, টিসিপি / ইউডিপি দ্বারা সংজ্ঞায়িত করা হয়।


6
না এটা না। আপনি আরও খুলতে পারেন, যতক্ষণ না দূরবর্তী ঠিকানাগুলি পৃথক হয় ততক্ষণ স্থানীয় বন্দরটি অনন্য হওয়ার দরকার নেই। তদুপরি, ওপি সার্ভার প্রতি জানিয়েছে এবং আপনার প্রতি সার্ভার>> ঠিকানা থাকতে পারে।
মার্কআর

0

Apache HTTP সার্ভার মাপকাঠিতে টুল, AB , 2.4 সংস্করণে রয়েছে -s সময়সীমার বিকল্প। আরও দেখুন AB (Apache, বেঞ্চ) ত্রুটি: apr_poll: সময় সমাপ্ত নিদিষ্ট (70007) মেয়াদ শেষ হয়ে গেছে Windows এ

এই বিকল্পটি আপনার সমস্যার সমাধান করে।

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