কম্পিউটার

আমাদের Sidekiq ক্লাস্টার স্ক্রিপ্ট প্রবর্তন

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

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

একাধিক Sidekiq প্রক্রিয়া চালানোর জন্য একটি সহজ কমান্ড

আমি সত্যিই যা চেয়েছিলাম তা হল একটি স্ক্রিপ্ট যা আমি একটি সিস্টেমড পরিষেবা হিসাবে চালাতে পারি যা প্রতি কোরে একটি Sidekiq প্রক্রিয়া তৈরি করবে এবং এটি এমন প্রসেসগুলি পুনরায় চালু করবে যা অত্যধিক মেমরি ব্যবহার করে। স্ক্রিপ্টটি বিভিন্ন আকারের EC2 দৃষ্টান্তগুলির সাথে কাজ করতে সক্ষম হওয়া দরকার, কারণ কোরের সংখ্যা এবং RAM এর পরিমাণ পরিবর্তিত হতে পারে কারণ আমি আমাদের কাজের চাপের জন্য সবচেয়ে ভাল কাজ করবে তা দেখার জন্য বিভিন্ন উদাহরণের আকার চেষ্টা করেছি। যেহেতু আমি এমন একটি স্ক্রিপ্ট খুঁজে পাইনি যা ঠিক এটি করবে, তাই আমি একটি লিখেছি:

অবশ্যই, সেই স্ক্রিপ্টে কিছুটা ধার করা কোড রয়েছে। :) process_count-এর কোড পদ্ধতিটি সম্ভবত স্ট্যাক ওভারফ্লো থেকে এসেছে (আমি আমাদের ইউনিকর্ন কনফিগারেশনে বহু বছর ধরে এটি ব্যবহার করছি) এবং fork_child পদ্ধতিটি মূলত sidekiq সাইডকিক মণি থেকে বিন।

এই স্ক্রিপ্টটি উপস্থিত CPU কোরের সংখ্যার উপর ভিত্তি করে অনেকগুলি চাইল্ড প্রক্রিয়া তৈরি করে, প্রতিটি চাইল্ড প্রক্রিয়া একই রকম হয় যেন আপনি sidekiq চালান। সরাসরি আদেশ করুন। ফলস্বরূপ, আপনি এই স্ক্রিপ্টে যে কমান্ড-লাইন বিকল্পগুলি পাস করবেন তা Sidekiq CLI কোডে পাস হবে (এবং পার্স করা হবে)৷ অন্য কথায়, আপনি এই স্ক্রিপ্টে যেকোনো বিকল্প পাস করতে পারেন যা আপনি sidekiq-এ পাস করতে পারেন এটি সরাসরি চালানোর সময়, যদিও কিছু বিকল্প (যেমন পিড ফাইল বিকল্প) ব্যবহার করার অর্থ হয় না। প্রতিটি শিশু প্রক্রিয়ার মেমরি ব্যবহার পর্যায়ক্রমে পরীক্ষা করার জন্য একটি থ্রেডও তৈরি করা হয়। যদি কোনও শিশু প্রক্রিয়া ব্যবহারের থ্রেশহোল্ড অতিক্রম করে, তবে এটিকে মেরে ফেলা হয় এবং এটি প্রতিস্থাপন করার জন্য একটি নতুন প্রক্রিয়া তৈরি করা হয়।

ক্লাস্টারের সাথে কাজ করা

যদিও প্রসেসের সংখ্যা কোরের সংখ্যার সাথে ডিফল্ট হয় (ধরে নিচ্ছেন যে আপনি Sidekiq প্রসেস চালানোর জন্য একটি উদাহরণ উৎসর্গ করছেন), আপনি স্ক্রিপ্ট চালানোর আগে SK_PROCESS_COUNT এনভায়রনমেন্ট ভেরিয়েবল সেট করে সেটিকে ওভাররাইড করতে পারেন। একইভাবে, মেমরি থ্রেশহোল্ডটি উদাহরণের মোট RAM এর শতাংশ হিসাবে সেট করা হয়েছে (লাইন 58-এ process_count মানতে একটি যোগ করে কিছু RAM বাকি রেখে), তবে আপনি SK_MEMORY_PCT_LIMIT এনভায়রনমেন্ট ভেরিয়েবলের সাথে যে কোনও শতাংশ সেট করতে পারেন। আমরা এই দুটি ভেরিয়েবল ব্যবহার করি Sidekiq প্রসেসের সংখ্যা এবং মেমরির ব্যবহার সীমিত করার জন্য যেগুলি আমাদের UI কে ক্ষমতা দেয় এমন Rails অ্যাপ চালাচ্ছে৷

একটি অতিরিক্ত বোনাস হিসাবে, এই স্ক্রিপ্টটি সাধারণত Sidekiq প্রক্রিয়াগুলি পরিচালনা করতে ব্যবহৃত সংকেতগুলিকে ধরে এবং সেই সংকেতগুলিকে শিশু প্রক্রিয়াগুলিতে প্রেরণ করে৷ এটি আমাদের pkill -f -USR1 skcluster ব্যবহার করতে দেয় চাইল্ড প্রক্রিয়াগুলি নতুন কাজ গ্রহণ করা বন্ধ করে দিতে (এটি আমাদের স্থাপনার স্ক্রিপ্টে একটি প্রাথমিক কাজ), এবং আমরা pkill -f skcluster ব্যবহার করতে পারি সবকিছু বন্ধ করতে।

সিস্টেমড কনফিগার করা হচ্ছে

সিস্টেমড পরিষেবার সংজ্ঞা সহজবোধ্য:

যেহেতু আমরা প্রতিটি দৃষ্টান্তে পোস্টগ্রেসের সাথে প্রক্সি সংযোগের জন্য pgbouncer ব্যবহার করি, তাই আমরা নিশ্চিত করি যে sidekiq প্রক্রিয়াগুলি বুট হওয়ার আগে pgbouncer পরিষেবা চলছে। আমরা যদি একই দৃষ্টান্তে redis চালাতাম, আমরা প্রয়োজন এবং আফটার লাইনগুলিতে redis-server.service যোগ করব। EnvironmentFile ফাইলের নামের সাথে - উপসর্গ ব্যবহার করে systemd কে বলে যে ফাইলটি না থাকলে ঠিক আছে। যখন আমরা ডিফল্ট প্রক্রিয়া গণনা এবং মেমরি সীমার সাথে যেতে চাই তখন এটি আমাদের সেই ফাইলটি বাদ দিতে দেয়। আমরা --require ব্যবহার করি আমাদের রেল অ্যাপ্লিকেশনের কনফিগারেশন এবং ইনিশিয়ালাইজারগুলি লোড করতে কোথায় যেতে হবে তা Sidekiqকে জানানোর বিকল্প। যেহেতু skcluster স্ক্রিপ্ট SIGTERM ক্যাচ করে, তাই আমরা systemctl restart skcluster.service ব্যবহার করতে পারি সমস্ত কর্মীদের পুনরায় চালু করতে (এটি আমাদের স্থাপনার স্ক্রিপ্টে একটি দেরী কাজ)।

আমরা এখন এই স্ক্রিপ্টটি কিছুক্ষণ ব্যবহার করছি, এবং এটি একটি চ্যাম্পের মতো কাজ করেছে। বুট করার সময় অনেকগুলি প্রসেস তৈরি হওয়ার সাথে আমাদের আর কোন সমস্যা নেই, আমাদের মনিটরিং থেকে আমাদের আর কোন মেমরি ব্যবহারের সতর্কতা নেই এবং আমরা যেকোন ধরণের EC2 উদাহরণ চালু করতে পারি যা আমরা চাই। ঝামেলা-মুক্ত অপ্স হল আমার সবচেয়ে পছন্দের অপ্স। :)


  1. পরিষ্কারভাবে Sidekiq স্কেলিং

  2. মঙ্গোডিবি কম্পাস উপস্থাপন করা হচ্ছে

  3. অবজেক্ট রকেট-এ মেট্রিক্স ড্যাশবোর্ড প্রবর্তন করা হচ্ছে

  4. রেলে একটি ওয়ান-টাইম স্ক্রিপ্ট লেখা