Nginx কর্মী_সংযোগের জন্য সর্বোত্তম মান


25

এনগিনেক্স worker_connections"একযোগে সংযোগের সর্বাধিক সংখ্যক সেট করে যা কোনও কর্মী প্রক্রিয়া দ্বারা খোলার সুযোগ রয়েছে This এই সংখ্যায় সমস্ত সংযোগ (যেমন প্রক্সী সার্ভারের সাথে সংযোগগুলি, অন্যদের মধ্যে অন্তর্ভুক্ত) অন্তর্ভুক্ত রয়েছে, কেবল ক্লায়েন্টের সাথে সংযোগ নেই Another আরেকটি বিবেচনা হ'ল একযোগে সংযোগের আসল সংখ্যা সর্বাধিক সংখ্যক উন্মুক্ত ফাইলের বর্তমান সীমা অতিক্রম করতে পারে না। এ সম্পর্কে আমার কয়েকটি প্রশ্ন রয়েছে:

  1. এর জন্য সর্বোত্তম বা প্রস্তাবিত মানটি কী হওয়া উচিত?
  2. উচ্চ সংখ্যক কর্মী সংযোগ ব্যবহারের ডাউনসাইডগুলি কী কী?

+1, ভাল প্রশ্ন!
সিএনএসটি

উত্তর:


31

আসুন ব্যবহারিক পদ্ধতি গ্রহণ করা যাক।

এই সমস্ত সীমাবদ্ধতা হ'ল হার্ডওয়্যার ধীর এবং ব্যয়বহুল যখন বিগত শতাব্দীতে হার্ডকডড এবং ডিজাইন করা ছিল things আমরা এখন ২০১ in সালে আছি, একটি গড় ওয়াল-মার্ট টোস্টার ডিফল্ট মানগুলির চেয়ে বেশি অনুরোধগুলি প্রক্রিয়া করতে পারে।

ডিফল্ট সেটিংস আসলে বিপজ্জনক। একটি ওয়েবসাইটে শত শত ব্যবহারকারী থাকা চিত্তাকর্ষক কিছুই নয়।

worker_process

একটি সম্পর্কিত সেটিং, আসুন আমরা বিষয়টি নিয়ে থাকাকালীন এটি ব্যাখ্যা করি।

লোড ব্যালেন্সার হিসাবে nginx:

  • এইচটিটিপি লোড ব্যালেন্সিংয়ের জন্য 1 জন কর্মী।
  • এইচটিপিএস লোড ভারসাম্যের জন্য কোর প্রতি 1 জন কর্মী।

ওয়েব সার্ভার হিসাবে nginx:

এই এক কঠিন।

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

এছাড়াও, কিছু অ্যাপ্লিকেশন / ফ্রেমওয়ার্ক / মিডলওয়্যার কেবল একবারে একটি অনুরোধ প্রক্রিয়া করতে পারে এবং সেগুলি ওভারলোড করার জন্য ব্যাকফায়ার হয়।

সাধারণভাবে বলতে গেলে, 1 জন কর্মী সর্বদা একটি নিরাপদ বাজি।

অন্যথায়, আপনি কী করছেন তা আপনি যদি জানেন তবে আপনি প্রতি জন প্রতি কর্মী রেখে যেতে পারেন। আমি সেই রুটটিকে একটি অপ্টিমাইজেশন হিসাবে বিবেচনা করব এবং সঠিক বেঞ্চমার্কিং এবং পরীক্ষার পরামর্শ দেব।

worker_connections

সংযোগের মোট পরিমাণ worker_process * worker_connections। লোড ব্যালেন্সার মোডে অর্ধেক।

এখন আমরা টোস্টার অংশে পৌঁছেছি। অনেকগুলি গুরুতরভাবে আন্ডাররেটেড সিস্টেম সীমা রয়েছে:

  • ইউলিমিটগুলি লিনাক্সের প্রক্রিয়া অনুযায়ী 1 কে সর্বাধিক খোলার ফাইল (1 কে নরম, কিছু ডিস্ট্রোতে 4k শক্ত)
  • সিস্টেমিত সীমাগুলি প্রায় ওলিমিটের সমান।
  • nginx ডিফল্ট হ'ল শ্রমিক প্রতি 512 সংযোগ।
  • আরও কিছু থাকতে পারে: সেলইনাক্স, সিস্কিটল, সুপারভাইজার (প্রতিটি ডিস্ট্রো + সংস্করণ কিছুটা আলাদা)

1 কে কর্মী_সংযোগ

নিরাপদ ডিফল্ট হ'ল সর্বত্র 1k স্থাপন করা।

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

10 কে কর্মী_সংযোগ

বিশেষত একটি পাবলিক ওয়েবসাইটের জন্য হাজার হাজার ক্লায়েন্ট থাকা খুব সাধারণ। কম ডিফল্টের কারণে আমি যে পরিমাণ ওয়েবসাইট দেখেছি সেগুলি গণনা বন্ধ করে দিয়েছি।

উত্পাদনের জন্য সর্বনিম্ন গ্রহণযোগ্য 10 কে। এটির অনুমতি দেওয়ার জন্য সম্পর্কিত সিস্টেমের সীমা বাড়াতে হবে।

খুব বেশি সীমাবদ্ধতার মতো কোনও জিনিস নেই (ব্যবহারকারী না থাকলে সীমাবদ্ধতার কোনও প্রভাব নেই)। তবে খুব কম-সীমাবদ্ধতা হ'ল একটি আসল জিনিস যার ফলে প্রত্যাখ্যাত ব্যবহারকারী এবং একটি মৃত সাইটের ফলাফল site

10 কেও বেশি

10 কে সুন্দর এবং সহজ।

আমরা এক নির্বিচার 1000kk সীমা নির্ধারণ করতে পারি (এটি সর্বোপরি কেবল একটি সীমা) তবে এটি ব্যবহারিকভাবে বোঝায় না, আমরা কখনই সেই ট্র্যাফিক পাই না এবং যাইহোক এটি নিতে পারি না।

আসুন 10 কে যুক্তিসঙ্গত সেটিং হিসাবে আটকে দিন। আরও যে পরিষেবাগুলির জন্য চলছে (এবং সত্যই করতে পারে) তার জন্য বিশেষ টিউনিং এবং বেঞ্চমার্কিং প্রয়োজন।

বিশেষ পরিস্থিতি: উন্নত ব্যবহার

কখনও কখনও, আমরা জানি যে সার্ভারের খুব বেশি সংস্থান নেই এবং আমরা স্পাইকগুলি আশা করি যা আমরা খুব বেশি করতে পারি না। আমরা বরং চেষ্টা করার চেয়ে ব্যবহারকারীদের প্রত্যাখ্যান করব। সেক্ষেত্রে যুক্তিসঙ্গত যুক্তি সীমাবদ্ধ রাখুন এবং দুর্দান্ত ত্রুটি বার্তা এবং পরিচালনা পরিচালনা করুন hand

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


আমি উত্তরটি পছন্দ করি তবে সত্য যে শিক্ষিত অনুমান করা যায় যে এটি কতটা উচ্চতর সেট করা উচিত, এটি প্রদর্শিত হয় যে আমরা কোনও সংযোগটি কতটা র‌্যাম গ্রহণ করে (উদাহরণস্বরূপ একটি সাধারণ স্ট্যাটিক ফাইলটি সংরক্ষণ করতে হবে sendfile) যাতে আমরা গুণতে পারি প্রদত্ত সংখ্যার সংখ্যা ধরে রাখতে কতটা র‌্যামের প্রয়োজন হবে তা গণনা করুন worker_connections
nh2

1
আপনি খুব বেশি টিউন না করে 10 কে পর্যন্ত করতে পারেন। সংযোগের বাফারগুলি sysctlসেটিংসে সেট করা আছে ।
ব্যবহারকারী5994461

10

ulimit -a আপনাকে বলবে যে আপনার সিস্টেম কতগুলি মুক্ত ফাইল কোনও প্রক্রিয়া ব্যবহারের অনুমতি দেয় allows

এছাড়াও, net.ipv4.ip_local_port_rangeপ্রতি আইপি সক্ষম করতে সকেটের মোট পরিসর সেট করে।

সুতরাং, আপনার worker_connectionsযে কোনওটির চেয়ে বেশি হতে পারে না বা আপনার ক্লায়েন্ট সংযোগগুলি সীমাবদ্ধ থাকবে net.core.netdev_max_backlog- টিসিপি সারির মোট আকার।

মনে রাখবেন যে আপনি যদি এনজিনেক্সকে বিপরীত প্রক্সি হিসাবে ব্যবহার করেন তবে এতে প্রতি সংযোগে দুটি সকেট ব্যবহার করা হয়। net.ipv4.tcp_fin_timeoutসকেটের অবস্থা দ্রুত স্যুইচ করার চেষ্টা করার জন্য আপনি এবং কার্নেল টিসিপি সম্পর্কিত সময়সীমার সাথে কিছুটা খেলতে চাইতে পারেন । আরেকটি বিষয় খেয়াল করার বিষয় হ'ল প্রতিটি সকেট টিসিপি মেমরি স্ট্যাকের মেমরি বরাদ্দ করে sysctl, আপনি টিসিপি মেমরি স্ট্যাক ব্যবহার করে কিছু সীমাও নির্ধারণ করতে পারেন, আপনি যতক্ষণ না সিপিইউ এবং পর্যাপ্ত ফাইল হ্যান্ডলার রাখবেন ততক্ষণ আপনি র‌্যামে আরও চাপ দিতে পারেন।

এফওয়াইআইতে প্রায় 32 গিগাবাইট র‌্যাম সহ একটি সার্ভার এবং সিসিকটেল ব্যবহার করে কিছু কার্নেল টিউনিংয়ের সাথে 1 এমএম একযোগে সংযোগগুলি পরিচালনা করার জন্য কিছু ভার্চুয়াল নেটওয়ার্ক ইন্টারফেস থাকতে পারে, এটি যথেষ্ট পরিমাণে কম্পিউটিং সংস্থান দেওয়া সম্ভব। আমার পরীক্ষাগুলি চলাকালীন যখন 1 এমএমেরও বেশি সংঘটিত আচরণ করেছে এবং প্রায় 700 বিাইটের পে-লোড প্রেরণ করার সময় সার্ভারটি প্রায় 1.2 মিমি যুগপত ক্লায়েন্ট আপডেট করতে 10 সেকেন্ড সময় নিয়েছিল। এরপরে কিছু অতিরিক্ত এনআইসি বন্ডিং করে এবং ভার্চুয়াল নিকগুলি ডাইচ করে নেটওয়ার্ক ব্যান্ডউইথথ বৃদ্ধি করা হয়েছিল। সমস্ত ক্লায়েন্টকে আপডেট করার পেওলড, ব্যান্ডউইথ এবং যুক্তিসঙ্গত সময় দিয়ে 1.2 মিমিও বেশি ক্লায়েন্টের সাথে রিয়েল-টাইম যোগাযোগের কাছাকাছি সিউডো অর্জন করা সম্ভব।

শুভ টিউনিং!


দয়া করে উম্মিতকে বাদ দিতে কমান্ডটি ঠিক করুন
Ali.MD

নোটটি net.ipv4.ip_local_port_rangeকেবল বহির্গামী সংযোগগুলির জন্য প্রাসঙ্গিক , আগত সংযোগগুলির জন্য নয় (যেমন 80 এবং 443 পোর্ট যেমন এনগিনেক্সের সাথে সাধারণ); দেখতে এখানে
nh2

@ এনএইচ 2 তবে যদি কেউ এনজিনেক্সকে বিপরীত প্রক্সি হিসাবে ব্যবহার করে থাকে তবে প্রতি ক্লায়েন্ট সংযোগে কমপক্ষে 2 টি সকেট খোলা থাকে এবং তারপরে এটি গুরুত্বপূর্ণ যে কার্নেলটি কতগুলি স্থানীয় পোর্ট সকেটকে বাঁধতে দেয়।
মার্সেল

হ্যাঁ এটা সঠিক।
nh2

0

উপযুক্ত আকার পরিবর্তন টেস্টিংয়ের মাধ্যমে আবিষ্কার করা যায়, কারণ এটি এনগিনেক্স হ্যান্ডলিংয়ের ট্র্যাফিকের ভিত্তিতে পরিবর্তনশীল।

তাত্ত্বিকভাবে, এনজিনেক্সগুলি পরিচালনা করতে পারে: সর্বাধিক ক্লায়েন্ট = কর্মী_প্রক্রিয়াগুলি * কর্মী_সংযোগ (* = গুণ) এবং কর্মী_প্রক্রিয়াগুলি = প্রসেসরের সংখ্যা

প্রসেসরের সন্ধানের জন্য, ব্যবহার করুন: গ্রেপ প্রসেসর / প্রক / সিপুইনফো | wc -l


প্রকৃতপক্ষে বিপরীত প্রক্সি সহ: সর্বাধিক_ক্লিয়েন্টস = (কর্মী_প্রক্রিয়াগুলি * কর্মী_সংযোগ) / (এক্স * 2) যেখানে এক্স যদিও এই ক্লায়েন্টগুলি আপনার সাথে করা একাধিক সমবর্তী সংযোগ রয়েছে। এছাড়াও, সংযোগ কাঠামো শোনার সকেট, এনজিএনএক্স প্রক্রিয়াগুলির মধ্যে অভ্যন্তরীণ নিয়ন্ত্রণ সকেট এবং আপস্ট্রিম সংযোগগুলির জন্য ব্যবহৃত হয়। সুতরাং এই সর্বোচ্চ ক্লায়েন্ট = কর্মী_প্রক্রিয়াগুলি * কর্মী_সংযোগগুলি কার্যকর হবে না কারণ আমরা জানি না অভ্যন্তরীণ নিয়ন্ত্রণ সকেটে অনেক সংযোগ ব্যবহৃত হচ্ছে।
আরতি

0

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

স্বল্প সংস্থান সীমা থাকা আপনার এইভাবে শারীরিক সংস্থানগুলিতে কম হতে পারে এবং এইগুলি যে নতুন সংযোগে বরাদ্দ করা উচিত, নতুন সংযোগগুলি ব্যয় করে অলস সংযোগ স্থাপনের পরিবর্তে নতুন সংযোগের জন্য বরাদ্দ করা উচিত to আরও চাপ প্রয়োজন পরিবেশন।

প্রস্তাবিত মানটি কী? এটি ডিফল্ট।

ডিফল্টগুলি সমস্ত নথির মধ্যে ডকুমেন্টেড থাকে:

ডিফল্ট: কর্মী_সংযোগ 512;

এবং উত্স-কোড পর্যায়েও নিশ্চিত হওয়াevent/ngx_event.c যায়

13 # ডিএফএএলএফুলT_CONNECTIONS 512 সংজ্ঞায়িত করুন


0

মার্সেলের উত্তরটি সত্যিই উঁচু করে তোলা দরকার! যদি ওলিমিটগুলি প্রায় 1 ক এর ডিফল্ট মানতে সেট করা থাকে তবে সর্বোচ্চ_ সংযোগগুলি একই মানের চারপাশে সেট করা উচিত অন্যথায় 10 কে-তে সর্বোচ্চ_সংযোগ স্থাপনের কোনও সুবিধা নেই।

আপনি কুইন্টেড অনুরোধ এবং সকেটগুলি এনজিএনএক্সে বন্ধ পাবেন যদি "আপনার কর্মী_সংযোগগুলি এর মধ্যে কোনওটির চেয়ে বেশি না হতে পারে, বা আপনার ক্লায়েন্ট সংযোগগুলি নেট.core.netdev_max_backlog- অবধি TCP সারির মোট আকার পর্যন্ত সারি করবে।"

একটি একক প্রক্রিয়া উমলিতরা যেমন অনুমতি দেয় তেমন সংযোগ হিসাবে খুলতে পারে। নাম_ ওয়ার্কার্স * সর্বোচ্চ_সংযোগগুলি সূত্র তবে বাইরের লোডবালেন্সার / প্রক্সি সর্বাধিক সংযোগ এবং ইউলিমিটকে যুক্তিসঙ্গত মানের জন্য বিবেচনায় নেওয়া দরকার। সর্বাধিক মানকে সর্বোচ্চ_সংযোগ স্থাপন করা ব্যালফায়ার হতে পারে কারণ ইউলিমিটগুলি একটি সীমাবদ্ধ ফ্যাক্টর হবে।


1
এটা আসলে ভুল। ডেস্কটপ লিনাক্সের নরম সীমাটি 1 কে, তবে তারা হার্ড সীমা (32 কে বা আরও বেশি) অবধি অনুরোধ করলে প্রসেসগুলি এর বেশি ব্যবহার করা থেকে বিরত রাখে না। max_connectionsডিফল্ট নরম সীমাটির চেয়ে বেশি হলে এনজিনেক্স স্বয়ংক্রিয়ভাবে উলিমিট বাড়িয়ে তুলবে ।
ব্যবহারকারী5994461
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.