কেন আমরা প্রতিক্রিয়া সময়ে হঠাৎ স্পাইক পেতে পারি?


12

আইআইএস-এ হোস্ট করা সার্ভিসস্ট্যাক ব্যবহার করে আমাদের প্রয়োগ করা একটি এপিআই রয়েছে। এপিআই-র লোড টেস্টিংয়ের সময় আমরা আবিষ্কার করেছি যে প্রতিক্রিয়ার সময়গুলি ভাল তবে আমরা প্রতি সার্ভারে প্রায় ৩,৫০০ একযোগী ব্যবহারকারীকে আঘাত করার সাথে সাথে এগুলি দ্রুত ক্ষয় হয়। আমাদের দুটি সার্ভার রয়েছে এবং তাদের 7,000 ব্যবহারকারীদের সাথে আঘাত করার সময় গড় প্রতিক্রিয়ার সময়গুলি সমস্ত শেষ পয়েন্টগুলির জন্য 500 মিমি এর নিচে বসে থাকে। বাক্সগুলি লোড ব্যালান্সারের পিছনে থাকে তাই আমরা প্রতি সার্ভারে 3,500 সম্মতি পাই। তবে আমরা মোট সহবর্তী ব্যবহারকারীর সংখ্যা বাড়ানোর সাথে সাথে আমরা প্রতিক্রিয়া বারগুলিতে একটি উল্লেখযোগ্য বৃদ্ধি দেখতে পাচ্ছি। প্রতি সার্ভারে সমবর্তী ব্যবহারকারীদের 5000 বাড়িয়ে দেওয়া আমাদের প্রায় 7 সেকেন্ডের শেষ প্রান্তে গড় প্রতিক্রিয়া সময় দেয়।

সার্ভারগুলিতে মেমরি এবং সিপিইউ বেশ কম, উভয় প্রতিক্রিয়া সময়গুলি যখন ভাল হয় এবং কমে যাওয়ার পরে। 10,000 সমবর্তী ব্যবহারকারীদের সাথে শীর্ষে সিপিইউ গড় গড় 50% এর নীচে এবং র‌্যাম 16 এর মধ্যে 3-4 গিগাবাইটের কাছাকাছি বসে থাকে This এটি আমাদের এই ভেবে ছেড়ে দেয় যে আমরা কোথাও কোথাও একরকম সীমাবদ্ধতা হারাচ্ছি। নীচের স্ক্রিনশটটিতে মোট 10,000 সহবর্তী ব্যবহারকারীদের সাথে লোড পরীক্ষার সময় পার্ফনের কয়েকটি কী কাউন্টার দেখানো হয়। হাইলাইট কাউন্টারটি অনুরোধগুলি / সেকেন্ড। স্ক্রিনশটের ডানদিকে আপনি দেখতে পাচ্ছেন যে প্রতি গ্রাফের জন্য অনুরোধগুলি সত্যই ইরটিক হয়ে উঠছে। এটি ধীর প্রতিক্রিয়া বারের জন্য প্রধান সূচক। এই প্যাটার্নটি দেখার সাথে সাথে আমরা লোড টেস্টে ধীর সাড়া দেওয়ার সময় লক্ষ্য করি।

পারফরম্যান স্ক্রিনশট প্রতি সেকেন্ডে অনুরোধগুলির সাথে হাইলাইট করা

আমরা এই পারফরম্যান্স সমস্যার সমস্যা সমাধানের বিষয়ে কীভাবে যাব? আমরা সনাক্ত করার চেষ্টা করছি এটি কোনও কোডিং সমস্যা বা কনফিগারেশন সমস্যা কিনা। ওয়েবকনফিগ বা আইআইএস-এ এমন কোনও সেটিংস রয়েছে যা এই আচরণটি ব্যাখ্যা করতে পারে? অ্যাপ্লিকেশন পুলটি .NET v4.0 চলছে এবং আইআইএস সংস্করণটি 7.5। আমরা ডিফল্ট সেটিংস থেকে একমাত্র পরিবর্তনটি হ'ল অ্যাপ্লিকেশন পুল কুই দৈর্ঘ্যের মানটি 1,000 থেকে 5,000 পর্যন্ত আপডেট করা । আমরা Aspnet.config ফাইলে নিম্নলিখিত কনফিগারেশন সেটিংসও যুক্ত করেছি:

<system.web>
    <applicationPool 
        maxConcurrentRequestsPerCPU="5000"
        maxConcurrentThreadsPerCPU="0" 
        requestQueueLimit="5000" />
</system.web>

আরো বিস্তারিত:

এপিআইটির উদ্দেশ্য হ'ল বিভিন্ন বাহ্যিক উত্স থেকে ডেটা একত্রিত করা এবং জেএসএন হিসাবে ফিরে আসা। এটি বর্তমানে ডেটা স্তরে স্বতন্ত্র বাহ্যিক কলগুলি ক্যাশে করতে একটি InMemory ক্যাশে প্রয়োগ ব্যবহার করছে। কোনও উত্সের প্রথম অনুরোধে প্রয়োজনীয় সমস্ত ডেটা আনা হবে এবং একই সংস্থানটির জন্য পরবর্তী যে কোনও অনুরোধগুলি ক্যাশে থেকে ফলাফল পাবে। আমাদের একটি 'ক্যাশে রানার' রয়েছে যা একটি ব্যাকগ্রাউন্ড প্রক্রিয়া হিসাবে প্রয়োগ করা হয় যা নির্দিষ্ট সেট বিরতিতে ক্যাশে থাকা তথ্য আপডেট করে। আমরা কোডটির চারপাশে লকিং যুক্ত করেছি যা বাহ্যিক সংস্থান থেকে ডেটা আনে। আমরা অ্যাসিক্রোনাস ফ্যাশনে বাহ্যিক উত্স থেকে ডেটা আনার জন্য পরিষেবাগুলিও প্রয়োগ করেছি যাতে শেষ পয়েন্টটি কেবল ধীরতম বাহ্যিক কল হিসাবে ধীরে ধীরে হওয়া উচিত (যদি না আমাদের কাছে অবশ্যই ক্যাশে থাকা ডেটা থাকে)। এটি System.Treadread.Tasks.Task বর্গ ব্যবহার করে করা হয়।প্রক্রিয়াটিতে উপলব্ধ থ্রেডের সংখ্যার দিক দিয়ে আমরা কি একটি সীমাবদ্ধতা উপস্থাপন করতে পারি?


5
আপনার সিপিইউতে কয়টি কোর রয়েছে? সম্ভবত আপনি একটি কোর সর্বাধিক আউট। যখন ম্যাজিক সংখ্যা 50%, 25% বা 12.5% ​​হয়, তখন এটি আপনাকে বোঝায় যে আপনি একটি মূল সর্বাধিক সরিয়ে নিয়েছেন এবং কোনও কারণে অলস হয়ে থাকা অন্যান্য কোরগুলি ব্যবহার করতে সক্ষম নন। একটি সর্বোচ্চ আউটড কোরের জন্য পরীক্ষা করুন।
ডেভিড শোয়ার্জ

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

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

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

1
সার্ভারগুলির জন্য ডিস্ক সেটআপ কী (ধরে নিবেন যে তারা ভারসাম্যপূর্ণ হওয়ায় ডিস্ক সেটআপটি একই রকম)? আপনি কি আপনার প্রাথমিক পোস্টে ড্রাইভ / সার্ভারের জন্য সমস্ত চশমা পোস্ট করতে পারেন? আইআইএস এবং আইআইএস লগ ফাইলের যে ফিজিকাল ড্রাইভ রয়েছে সেগুলিতে আপনি কি ডিস্ক (গুলি) এ ছুঁড়ে ফেলেছেন? ৩,৫০০ টি অনুরোধে = ৩,৫০০+ আইআইএস লগ প্রবেশের ফলে আপনি ডিস্কের সাথে সমস্যার সম্মুখীন হচ্ছেন এটি বেশ সম্ভব। যদি তারা একই ডিস্ক / পার্টিশনে থাকে তবে আপনার সেখানে একটি বড় সমস্যা হতে পারে।
টেকি জো

উত্তর:


2

@ ডেভিডশওয়ার্টজ এবং @ ম্যাটকে অনুসরণ করে এটি থ্রেডের মতো দেখাচ্ছে, ইস্যু পরিচালনা ইস্যুটিকে।

আমার পরামর্শ:

  1. তাদের জন্য উত্পন্ন বাহ্যিক কল এবং ক্যাশে স্থির করুন এবং কেবল সার্ভার - পরিবেশের সাথে সম্পর্কিত নয় এমন কোনও সমস্যা ফেলে দেওয়ার জন্য স্থির বাহ্যিক তথ্যের সাথে লোড পরীক্ষা চালান।

  2. থ্রেড পুল ব্যবহার না করা হলে সেগুলি ব্যবহার করুন।

  3. বাহ্যিক কল সম্পর্কে আপনি বলেছিলেন "আমরা অ্যাসিক্রোনাস ফ্যাশনে বাহ্যিক উত্স থেকে ডেটা আনার জন্য পরিষেবাগুলিও প্রয়োগ করেছি যাতে শেষের অবস্থানটি ধীরতম বাহ্যিক কলের মতোই ধীর হওয়া উচিত (যদি না আমাদের কাছে অবশ্যই ক্যাশে থাকা ডেটা থাকে)। "

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

যদি সমস্যাটি এখনও অব্যাহত থাকে তবে আমি টাস্ক ক্লাস এড়ানো এবং একই অনুরূপ থ্রেড পুলের মাধ্যমে বহিরাগত কলগুলি করার অনুরোধ করব যা ব্যবহারকারীদের অনুরোধগুলি পরিচালনা করে। এটি পূর্বের পরিস্থিতি এড়াতে।

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