আমরা কি সঠিকভাবে সারিবদ্ধভাবে সিরিয়াল করছি?


13

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

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

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

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

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

[1]: আমাদের ব্যবসায়ের প্রকৃতির অর্থ আমরা যত দ্রুত বার্তাগুলি প্রক্রিয়াকরণ করব তত বেশি অর্থ উপার্জন করব। আমরা অভিজ্ঞতার সাথে প্রমাণ করেছি যে সপ্তাহের পরে কোনও বার্তা প্রক্রিয়াকরণের অর্থ আমরা সেই অর্থোপার্জনের সম্ভাবনা কম। "প্রতি মিনিটে 1000" এর পারফরম্যান্সটি বেশ দ্রুত শোনায়, আমাদের সত্যিই 10 কে / মিনিটের উপরে of সংখ্যাটি দরকার। কেবলমাত্র আমি প্রতি সপ্তাহে বার্তায় সংখ্যা দিচ্ছি তার অর্থ এই নয় যে এই বার্তাগুলি প্রক্রিয়া করার জন্য আমাদের কাছে একটি পুরো সপ্তাহ রয়েছে have

================ সম্পাদনা:

অতিরিক্ত তথ্য

মন্তব্যের উপর ভিত্তি করে, আমি কিছু স্পষ্টতা যোগ করব:

  • আমি নিশ্চিত না সিরিয়ালাইজেশন আমাদের বাধা। আমি অ্যাপ্লিকেশনটিকে বেঞ্চমার্ক করেছি এবং সিরিয়ালাইজেশন তাপ গ্রাফটিতে প্রদর্শিত হওয়ার পরে, এটি কেবলমাত্র পরিষেবাটির সিপিইউ ব্যবহারের 2.5-3% এর জন্য দায়ী।

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

  • আরও র‌্যাম যুক্ত করা একটি স্টপগ্যাপ পরিমাপ। মেশিনটি ইতিমধ্যে 4 গিগাবাইট -> 16 গিগাবাইট র‍্যাম থেকে চলে গেছে এবং আরও যুক্ত করা চালিয়ে যেতে আরও শক্ত এবং শক্ত হয়ে উঠছে।

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

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

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

  • আমার লক্ষ্যগুলি হ'ল মেমোরির পদচিহ্নগুলি হ্রাস করার সময় এবং বর্তমান পুঁজির সর্বনিম্ন ব্যয় সহ দোষ সহনশীলতা বাড়ানোর সময় বর্তমান থ্রুপুট বজায় রাখা।


প্রশ্নগুলিতে প্রাসঙ্গিক পয়েন্টগুলি অন্তর্ভুক্ত করার কারণে মন্তব্যগুলি পরিষ্কার করা হয়েছিল।
ক্রিসএফ

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

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

উত্তর:


1

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


4

বেশ কিছু বছর আগে আমাদের একটি কাতারযুক্ত মেসেজ সিস্টেম (আমাদের ক্ষেত্রে অডিও ফিঙ্গারপ্রিন্ট) নিয়ে কিছুটা একই পরিস্থিতি ছিল। আমরা এনকুইড হওয়া ডেটা প্যাকেটগুলির দৃ .়তার জন্য দৃ strongly়তার সাথে মূল্যবান মূল্যবান মূল্য দিয়েছিলাম, কিন্তু আমরা জানতে পেরেছি যে সমস্ত কিছু ডিস্কে সজ্জিত করা এবং ডিস্ক থেকে সারিটি নেওয়া খুব ব্যয়বহুল।

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

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

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

আপনি যদি আগ্রহী হন তবে আমি VMQueueশ্রেণীর উত্স কোডটি ভাগ করতে পারি যাতে আপনি এটির সাথে চারপাশে খেলতে পারেন। ক্রিয় সিরিয়ালাইজযোগ্য হিসাবে চিহ্নিত যে কোনও শ্রেণিকে গ্রহণ করবে। সারি তৈরি হওয়ার পরে আপনি উপাদানের সংখ্যায় পৃষ্ঠার আকার স্থাপন করুন। শ্রেণি ইন্টারফেসটি কার্যত কোনও মানক সারির শ্রেণীর মতো। কোডটি যদিও খুব পুরানো, (.net 1.1) সুতরাং দুর্ভাগ্যক্রমে কোনও জেনেরিক ইন্টারফেস বিদ্যমান নেই।

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


1

এইচপি প্রলিয়েন্ট এমএল 350 জি 5 সিস্টেম প্রতি মিনিটে 82 কে লেনদেন পায় - যেমন এটিতে আপনার উল্লেখ করা "10 কে / মিনিট" থ্রুপুট 8x এরও বেশি রয়েছে।

পারফরম্যান্স: 82,774 টিপিএমসি

এছাড়াও, সত্যি কথা বলতে, আমি সবেমাত্র 64 বা 128 গিগাবাইট র‍্যাম নিয়ে চলেছি - র‌্যাম সস্তা। গ্রিনস্পান "এদিকে র‌্যাম নিক্ষেপ করুন" এবং "এটির অনুকূলকরণের জন্য একটি স্মার্ট এমআইটি-শিক্ষিত লোক পান" এবং র‌্যাম জিতেছে তার মধ্যে পার্থক্যটি নির্দেশ করে।

তিনি 64 গিগাবাইট র‌্যাম দিয়ে সজ্জিত একটি এসকিউএল সার্ভার মেশিন এবং এএসপি.এনইটি পৃষ্ঠাগুলি চালিত কয়েকটি মুখ্য ফ্রন্ট-এন্ড মেশিন দিয়ে শেষ করেছেন ... সাইটটি, swaptree.com, বর্তমানে এর বর্তমান সদস্যতা 400,000 এরও বেশি ব্যবহারকারীদের (দ্রুত বর্ধমান) পরিচালনা করে কোনোরকম অসুবিধা ছাড়াই...

দ্রষ্টব্য "মেশিনটি ইতিমধ্যে ১ GB গিগাবাইট র‍্যামে চলে গেছে" যথেষ্ট নয়, একটি নিবন্ধে এমন একটি সার্ভার দেখানো হয়েছে যা k৪ জিবি র‍্যামে ৪০০ কে ব্যবহারকারীকে পরিচালনা করছে।

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