উত্পাদনে উবুন্টু কর্মক্ষমতা হ্রাসের উপর নোড.জেএস, মঙ্গডব, রেডিস, র‌্যাম বিনামূল্যে, সিপিইউ 100%


11

প্রশ্নের শিরোনামে যেমন বোঝা যাচ্ছে, গ্রহণযোগ্য পারফরম্যান্স অর্জনের জন্য আমার অ্যাপ্লিকেশনটিতে কী কী উন্নতি করা যেতে পারে (বা ওএস, উবুন্টুতে টিউন করা হয়েছে) তা নির্ধারণ করার জন্য আমার একটি কঠিন সময় কাটছে। তবে প্রথমে আমি স্থাপত্যটি ব্যাখ্যা করব:

ফ্রন্ট-এন্ড সার্ভারটি একটি 8 টি মেশিন যা 8 জিগ র‌্যামের সাথে উবুন্টু 12.04 চলছে। অ্যাপ্লিকেশনটি সম্পূর্ণ জাভাস্ক্রিপ্টে লিখিত এবং নোড.জেএস ভি 0.8.22 তে চালিত হয়েছে (কিছু মডিউল নোডের নতুন সংস্করণগুলিতে অভিযোগ বলে মনে হচ্ছে) আমি পোর্ট 80 এবং 443 থেকে 8 নোড কর্মীদের পরিচালিত প্রক্সি HT ট্র্যাফিকের জন্য এনজিনেক্স 1.4 ব্যবহার করি এবং নোড ক্লাস্টার এপিআই ব্যবহার শুরু করে। আমি ওয়েবসকেট সংযোগগুলি পরিচালনা করতে সকেট.আইও 0.9.14 এর সর্বশেষতম সংস্করণ ব্যবহার করি, যার ভিত্তিতে আমি কেবল ওয়েবসকেট এবং এক্সএইচআর-পোলিংকে উপলব্ধ ট্রান্সপোর্ট হিসাবে সক্ষম করেছি। এই মেশিনে আমি রেডিসের একটি উদাহরণও চালিয়েছি (২.২)

আমি 4gigs র‌্যাম এবং 2 কোর সহ মঙ্গোদব (৩.6) এর দ্বিতীয় সার্ভারে অবিচ্ছিন্ন ডেটা (ব্যবহারকারী এবং স্কোরের মতো) সঞ্চয় করি।

অ্যাপ্লিকেশনটি কয়েক মাস থেকেই উত্পাদনে রয়েছে (এটি কয়েক সপ্তাহ আগে পর্যন্ত একক বাক্সে চলছে) এবং এটি প্রতিদিন প্রায় 18k ব্যবহারকারী ব্যবহার করছেন। এটি সর্বদা একটি মূল ইস্যু ছাড়াও খুব ভালভাবে কাজ করেছে: পারফরম্যান্স অবক্ষয়। ব্যবহারের সাথে, প্রতিটি প্রক্রিয়া দ্বারা ব্যবহৃত সিপিইউয়ের পরিমাণ বৃদ্ধি পায় যতক্ষণ না এটি শ্রমিককে নির্ধারিত করে (যা আর অনুরোধগুলি দেয় না)। আমি প্রতি মিনিটে প্রতিটি কর্মীর দ্বারা ব্যবহৃত সিপিইউ পরীক্ষা করে এটি অস্থায়ীভাবে সমাধান করেছি এবং যদি এটি 98% এ পৌঁছায় তবে পুনরায় চালু করব। সুতরাং এখানে সমস্যাটি মূলত সিপিইউ, এবং র‌্যামের নয়। আমি সকেট.আইও ০.৯.১৪ এ আপডেট করেছি যেহেতু র‌্যাম আর কোনও সমস্যা নয় (পূর্ববর্তী সংস্করণটি মেমরি ফাঁস করছিল) তাই আমি সন্দেহ করি এটি একটি মেমরি ফাঁস হওয়ার সমস্যা হতে পারে, বিশেষত কারণ এখন এটি সিপিইউ যা মোটামুটি দ্রুত বৃদ্ধি পায় ( আমাকে প্রতিটি কর্মীকে দিনে 10-12 বারের মতো পুনরায় চালু করতে হবে!)। ব্যবহারের র‌্যামটি যথাযথ হওয়ার পাশাপাশি বৃদ্ধি পায়, তবে খুব আস্তে আস্তে, ব্যবহারের প্রতিটি 2-3 দিনে 1 গিগ এবং আশ্চর্যের বিষয় হ'ল আমি সম্পূর্ণ অ্যাপ্লিকেশন পুরোপুরি পুনরায় চালু করার পরেও এটি প্রকাশিত হয় না। আমি যদি সার্ভারটি রিবুট করি তবেই এটি মুক্তি পাবে! এটি আমি বুঝতে পারি না ...

আমি এখন নোডফ্লাই আবিষ্কার করেছি যা আশ্চর্যজনক, তাই শেষ পর্যন্ত আমি দেখতে পাচ্ছি যে আমার প্রোডাকশন সার্ভারে কী ঘটছে, এবং আমি কয়েক দিন ধরে ডেটা সংগ্রহ করছি। যদি কেউ চার্ট দেখতে চান তবে আমি আপনাকে অ্যাক্সেস দিতে পারি, তবে মূলত আমি দেখতে পাচ্ছি যে আমার 80 থেকে 200 এর মধ্যে সমবর্তী সংযোগ রয়েছে! আমি নোড.জেএস থেকে কয়েক হাজার অনুরোধ নয়, হাজার হাজার পরিচালনা করার প্রত্যাশা করছিলাম। এছাড়াও HTTP ট্র্যাফিকের গড় প্রতিক্রিয়া সময় 500 এবং 1500 মিলি সেকেন্ডের মধ্যে ভেসে যায় যা আমি মনে করি সত্যই অনেক বেশি। এছাড়াও, অনলাইনে ১৩০০ জন ব্যবহারকারীকে নিয়ে এই মুহুর্তে এটিই "এসএস-এস" এর আউটপুট:

Total: 5013 (kernel 5533)
TCP:   8047 (estab 4788, closed 3097, orphaned 139, synrecv 0, timewait 3097/0), ports 0

Transport Total     IP        IPv6
*         5533      -         -
RAW       0         0         0
UDP       0         0         0
TCP       4950      4948      2
INET      4950      4948      2
FRAG      0         0         0

যা দেখায় যে টাইমওয়েটে আমি অনেক বন্ধ সংযোগ পেয়েছি। আমি সর্বাধিক উন্মুক্ত ফাইলগুলি 999999 এ বৃদ্ধি করেছি, এখানে উলিমিট-এ এর আউটপুট রয়েছে:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63724
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 999999
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) 63724
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

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

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

আশা করি এখানে স্পষ্টতই কিছু আছে যে আমি ভুল করছি, এবং কেউ এটি সনাক্ত করতে সহায়তা করবে ... আরও তথ্যের জন্য আমাকে নির্দ্বিধায় জিজ্ঞাসা করুন এবং আমি প্রশ্নের দৈর্ঘ্যের জন্য দুঃখিত তবে প্রয়োজনীয় ছিল আমি বিশ্বাস করি ... আগাম ধন্যবাদ!


নোড.জেএস থেকে থ্রেড ডাম্পের মতো কিছু পাওয়ার কী উপায় আছে? অসীম লুপটিতে সম্ভবত কিছু থ্রেড রয়েছে। এছাড়াও, আসলে সিপিইউ কী ব্যবহার করছে? topসিপিইউ ব্যবহার 100% এর কাছাকাছি থাকলে আপনি কী দেখতে পাচ্ছেন ?
rvs

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


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

উত্তর:


10

কয়েক দিনের তীব্র বিচার এবং ত্রুটির পরে, আমি বলতে পেরে খুশি হয়েছি যে আমি বুঝতে পেরেছি যে অটলটি কোথায় ছিল, এবং আমি এখানে এটি পোস্ট করব যাতে অন্য লোকেরা আমার অনুসন্ধান থেকে উপকৃত হতে পারে।

সমস্যাটি আমি সকেট.ইওর সাথে যে পাব / সাব সংযোগগুলি ব্যবহার করেছিলাম এবং বিশেষত রেডস্টোরটিতে সকেট উদাহরণগুলির আন্তঃ প্রক্রিয়া যোগাযোগ পরিচালনা করতে সকেট.ইও দ্বারা ব্যবহৃত হয়।

আমি রেডিস ব্যবহার করে সহজেই আমার নিজের পাব / সাবটির সংস্করণটি প্রয়োগ করতে পারি বুঝতে পেরে, আমি এটিকে চেষ্টা করে দেখার সিদ্ধান্ত নিয়েছি এবং এটি ডিফল্ট মেমরি স্টোরের সাথে রেখে redisstore সকেট.ইও থেকে সরিয়ে নিয়েছি (আমার কাছে সম্প্রচারের দরকার নেই) সমস্ত সংযুক্ত ক্লায়েন্ট তবে কেবল 2 টি পৃথক ব্যবহারকারীদের মধ্যেই সম্ভবত বিভিন্ন প্রক্রিয়াতে সংযুক্ত রয়েছে)

প্রথমদিকে আমি প্রতিটি সংযুক্ত ক্লায়েন্টের উপর পাব / সাব পরিচালনা করার জন্য কেবলমাত্র 2 টি গ্লোবাল রেডিস সংযোগ এক্স প্রসেস ঘোষণা করেছিলাম এবং অ্যাপ্লিকেশনটি কম রিসোর্স ব্যবহার করছে তবে আমি এখনও ধ্রুবক সিপিইউ ব্যবহারের দ্বারা প্রভাবিত হচ্ছিলাম, তাই খুব বেশি পরিবর্তন হয়নি। তবে আমি সিদ্ধান্ত নিয়েছি যে প্রতিটি ক্লায়েন্টকে কেবল তাদের সেশনগুলিতে তাদের পাব / সাব পরিচালনা করতে পুনরায় redis করতে 2 টি নতুন সংযোগ তৈরি করার চেষ্টা করব, তারপরে ব্যবহারকারী সংযোগ বিচ্ছিন্ন হয়ে গেলে সংযোগগুলি বন্ধ করে দিন। তারপরে উত্পাদনের একদিন ব্যবহারের পরে, সিপিইউ এখনও 0-5% এ ছিল ... বিঙ্গো! আমি যে পারফরম্যান্সটি আশা করছিলাম তাতে কোনও প্রক্রিয়া পুনরায় আরম্ভ হবে না, কোনও বাগ নেই। এখন আমি বলতে পারি যে নোড.জেস শিলা এবং এই অ্যাপটি তৈরির জন্য এটি চয়ন করে খুশি happy

ভাগ্যক্রমে redis অনেকগুলি একযোগে সংযোগগুলি হস্তান্তর করার জন্য ডিজাইন করা হয়েছে (মঙ্গো দ্বারা পৃথকভাবে) এবং ডিফল্টরূপে এটি 10k এ সেট করা হয়, যা প্রায় 5k সমবর্তী ব্যবহারকারীদের জন্য একক রেডিস উদাহরণে স্থান দেয় যা আমার জন্য এই মুহুর্তের জন্য যথেষ্ট, তবে আমি ' এটি পড়তে পেরেছেন যে এটি 64k একযোগে সংযোগ স্থাপন করা যেতে পারে, সুতরাং এই আর্কিটেকচারটি যথেষ্ট দৃ be় হওয়া উচিত বলে আমি বিশ্বাস করি।

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

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

চিয়ার্স।


2
আমার প্রযোজনা অ্যাপ্লিকেশনটিতে একই সমস্যা হিসাবে উপস্থিত বলে মনে হচ্ছে, যা সার্ভার প্রশাসকের ভূমিকাতেও নতুন। আপনি ধারণায় যা করেছেন তা আমি অনুসরণ করি, তবে এটি কীভাবে করবেন সে সম্পর্কে আমার কিছু প্রশ্ন রয়েছে - সম্ভবত আপনি নিজের গৃহীত উত্তরে কিছু সংস্থার লিঙ্ক সরবরাহ করতে পারেন? নাকি কেবল আরও তথ্য সরবরাহ করবেন? বিশেষত "তবে তারপরে আমি সিদ্ধান্ত নিয়েছি যে প্রতিটি ক্লায়েন্ট কেবলমাত্র তাদের সেশনে তাদের পাব / সাব পরিচালনা করতে পুনরায় 2 টি নতুন সংযোগ তৈরি করার চেষ্টা করব, তারপরে ব্যবহারকারী সংযোগ বিচ্ছিন্ন হয়ে গেলে সংযোগগুলি বন্ধ করে দিন।"
toblerpwn

2

আপনার কি ডাম্প করার জন্য কোনও সোর্স কোড আছে? এটি ডাটাবেসের সাথে সংযোগগুলি বন্ধ নাও হতে পারে? HTTP সংযোগের জন্য অপেক্ষা করা প্রক্রিয়াগুলি যা কখনই বন্ধ হয় না।

আপনি কিছু লগ পোস্ট করতে পারেন?

একটি পিএস-শেফ করুন এবং নিশ্চিত করুন যে এখনও কিছু চলছে না। আমি দেখেছি ওয়েব প্রক্রিয়াগুলি এমন জম্বিগুলি ছেড়ে যায় যা আপনি কিল -9 না করা পর্যন্ত মারা যায় না। কখনও কখনও শাটডাউন কাজ করে না বা পুরোপুরি কাজ করে না এবং থ্রেডগুলি বা প্রক্রিয়াগুলি র‌্যাম এবং কখনও কখনও সিপিইউ ধরে রাখে।

কোডে কোথাও এটি একটি অসীম লুপ বা ডিবি সংযোগের উপরে থাকা ক্র্যাশ প্রক্রিয়া হতে পারে।

এনপিএম মডিউলগুলি কী ব্যবহার করছে? তারা সব কি সর্বশেষ?

আপনি কি ব্যতিক্রম ধরছেন? দেখুন: http://geoff.greer.fm/2012/06/10/nodejs-dealing-with-erferences/ দেখুন: /programming/10122245/capture-node-js-crash-reason

সাধারণ টিপস:

http://clock.co.uk/tech-blogs/preventing-http-raise-hangup-error-on-destroyed-socket-write-from-crashing-your-nodejs-server

http://blog.nodejitsu.com/keep-a-nodejs-server-up-with-forever

http://hectorcorrea.com/blog/running-a-node-js-web-site-in-production-a-beginners-guide

/programming/1911015/how-to-debug-node-js-applications

https://github.com/dannycoates/node-inspector

http://elegantcode.com/2011/01/14/taking-baby-steps-with-node-js-debugging-with-node-inspector/


1

প্রতি উত্তর কোনও উত্তর নয়, কারণ আপনার প্রশ্নটি একটি উত্তর-উত্তর পয়েন্ট-আউট প্রশ্নের চেয়ে বেশি গল্পের।

কেবল এটিই বলতে পারি যে আমি সাফল্যের সাথে একটি নোড.জেএস সার্ভার তৈরি করেছি যাতে 700 বাইটের বার্তা পেইড লোডের সাথে 1 মিলিয়ন অবিচ্ছিন্ন সংযোগগুলি পরিচালনা করে।

1 জিবিপিএসের নেটওয়ার্ক ইন্টারফেস কার্ডটি শুরুতে স্যাচুরেটিং ছিল এবং আমি প্রচুর আই / ও দেখতে পেলাম সমস্ত ক্লায়েন্টের ইভেন্ট প্রকাশিত হতে।

প্রক্সি ভূমিকা থেকে এনজিনেক্স সরিয়ে নেওয়াও মূল্যবান স্মৃতি ফিরে পেয়েছিল, কারণ শুধুমাত্র এক সার্ভারের সাথে এক মিলিয়ন স্থির সংযোগে পৌঁছানো, কনফিগারেশন, অ্যাপ্লিকেশন এবং ওএস প্যারামিটারগুলিকে টান করা শক্ত কাজ। মনে রাখবেন যে এটি কেবল প্রচুর র‍্যামের সাথে কার্যকর (প্রায় 1 এম ওয়েবসকেট সংযোগগুলি নোড.জেএস সহ প্রায় 16 গিগাবাইট র‌্যাম খায়), আমি মনে করি সোক.জেএস ব্যবহার কম স্বল্প স্মৃতির জন্য ব্যবহারযোগ্য, তবে আপাতত সকেট.ইও যে বেশি খরচ করে)।

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

আছে HTH,

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