আইআইএস-এ হোস্ট করা সার্ভিসস্ট্যাক ব্যবহার করে আমাদের প্রয়োগ করা একটি এপিআই রয়েছে। এপিআই-র লোড টেস্টিংয়ের সময় আমরা আবিষ্কার করেছি যে প্রতিক্রিয়ার সময়গুলি ভাল তবে আমরা প্রতি সার্ভারে প্রায় ৩,৫০০ একযোগী ব্যবহারকারীকে আঘাত করার সাথে সাথে এগুলি দ্রুত ক্ষয় হয়। আমাদের দুটি সার্ভার রয়েছে এবং তাদের 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 বর্গ ব্যবহার করে করা হয়।প্রক্রিয়াটিতে উপলব্ধ থ্রেডের সংখ্যার দিক দিয়ে আমরা কি একটি সীমাবদ্ধতা উপস্থাপন করতে পারি?