Redis কর্মক্ষমতা উপর একটি মহান জোর দিয়ে উন্নত করা হয়. আপনি একটি খুব স্থিতিশীল এবং দ্রুত পণ্যের অভিজ্ঞতা পাবেন তা নিশ্চিত করতে আমরা প্রতিটি রিলিজের সাথে আমাদের যথাসাধ্য চেষ্টা করি।
তবুও, আপনি যদি Redis-এর কার্যকারিতা উন্নত করার জন্য জায়গা খুঁজে পান বা একটি কর্মক্ষমতা রিগ্রেশন তদন্ত করে থাকেন, তাহলে আপনার Redis-এর কর্মক্ষমতা নিরীক্ষণ ও বিশ্লেষণের একটি সংক্ষিপ্ত পদ্ধতিগত উপায় প্রয়োজন। এটি সেই অপ্টিমাইজেশনগুলির একটির গল্প।
শেষ পর্যন্ত, আমরা স্ট্রীমের ইনজেস্ট কার্যক্ষমতা প্রায় 20% উন্নত করেছি, এমন একটি উন্নতি যা আপনি ইতিমধ্যেই Redis v7.0-এ সুবিধা নিতে পারবেন।
একটি আদর্শ SPEC
অপ্টিমাইজেশানে ঝাঁপিয়ে পড়ার আগে, আমরা কীভাবে এটিতে পৌঁছলাম সে সম্পর্কে আমরা আপনাকে একটি উচ্চ-স্তরের ধারণা দিতে চাই৷
আগেই বলা হয়েছে, আমরা Redis পারফরম্যান্স রিগ্রেশন এবং/অথবা সম্ভাব্য অন-সিপিইউ পারফরম্যান্স উন্নতি সনাক্ত করতে চাই। এটি করার জন্য, আমরা পারফরম্যান্স এবং পর্যবেক্ষণের প্রয়োজনীয়তা এবং প্রত্যাশা সম্পর্কিত সমস্ত বিষয়ে ক্রস-কোম্পানি এবং ক্রস-কমিউনিটি মানগুলির একটি সেট তৈরি করার প্রয়োজনীয়তা অনুভব করেছি।
সংক্ষেপে, আমরা ক্রমাগত SPEC-এর বেঞ্চমার্কগুলিকে শাখা/ট্যাগ দ্বারা ভেঙে ফেলি এবং ফলাফলের কার্যকারিতা ডেটা ব্যাখ্যা করি যার মধ্যে প্রোফাইলিং টুল/প্রোবার আউটপুট এবং ক্লায়েন্ট আউটপুট একটি "জিরো-টাচ" সম্পূর্ণ স্বয়ংক্রিয় মোডে অন্তর্ভুক্ত থাকে।
ব্যবহৃত যন্ত্রগুলি সবই ওপেন সোর্স এবং মেমটিয়ার_বেঞ্চমার্ক, রেডিস-বেঞ্চমার্ক, লিনাক্স পারফ_ইভেন্টস, বিসিসি/বিপিএফ ট্রেসিং টুল এবং ব্রেন্ডন গ্রেগের ফ্লেমগ্রাফ রেপোর মতো টুল/জনপ্রিয় ফ্রেমওয়ার্কের উপর নির্ভর করে।
আমরা কীভাবে Redis এর সাথে প্রোফাইলার ব্যবহার করি সে সম্পর্কে আপনি যদি আরও বিশদ জানতে আগ্রহী হন, তাহলে আমরা আমাদের অত্যন্ত বিস্তারিত “ এ একবার নজর দেওয়ার পরামর্শ দিই অন-সিপিইউ প্রোফাইলিং এবং ট্রেসিংয়ের জন্য পারফরম্যান্স ইঞ্জিনিয়ারিং গাইড ।"
কর্মক্ষমতা উন্নত করতে ডুপ্লিকেট গণনা এড়িয়ে চলুন
এই প্রথম ধাপটি দেওয়ার সাথে সাথে আমরা প্রোফাইলিং টুল/প্রোবারদের আউটপুট ব্যাখ্যা করা শুরু করেছি। একটি আকর্ষণীয় প্যাটার্ন উপস্থাপনকারী মানদণ্ডগুলির মধ্যে একটি হল স্ট্রীমসের ইনজেস্টেড বেঞ্চমার্ক যা নীচের একটির অনুরূপ কমান্ড সহ একটি স্ট্রীমে ডেটা প্রবেশ করায়:
`XADD কী * ফিল্ড মান`।
আমরা লক্ষ্য করেছি যে আইডি ছাড়া একটি স্ট্রীমে যোগ করার সময়, এটি SDS তৈরি/মুক্তকরণ/sdslen-এ ডুপ্লিকেট কাজ তৈরি করে যার জন্য CPU চক্রের প্রায় 10% খরচ হয়, যা পরবর্তী দুটি পারফ রিপোর্ট প্রিন্টে বিস্তারিতভাবে দেখানো হয়েছে।
একই ইনপুটগুলির জন্য, sdscatfmt এবং _sdsnewlen দুবার কল করা হয়েছিল:
নিম্নলিখিত মানদণ্ডের ফলাফলগুলি নিশ্চিত করা হিসাবে এটি আমাদের প্রায় 9-10% স্ট্রিম ইনজেশন অপ্টিমাইজ করতে দেয়:
অস্থির শাখার বেসলাইন ( 6b403f5 ) :
এই পিআরের প্রথম প্রতিশ্রুতি (ডুপ কাজ এড়িয়ে চলুন):
পারফরম্যান্স উন্নত করতে ডুপ্লিকেট বরাদ্দ এড়ানো
এই ব্যবহারের ক্ষেত্রে উন্নতির প্রাথমিক ফোকাস ওরানের (কোর-টিমের একজন সদস্য) থেকে আরও বিশ্লেষণের দিকে পরিচালিত করে যেটি CPU চক্রের আরেকটি অপচয় লক্ষ্য করেছে। এই সময়, এটি একই কোড ব্লকের মধ্যে অ-অনুকূল মেমরি ব্যবস্থাপনার কারণে হয়েছিল। আমরা একটি খালি এসডিএস বরাদ্দ করছিলাম, এবং তারপরে এটি পুনরায় বরাদ্দ করছি। কলের সংখ্যা হ্রাস করা আমাদের আরও একটি গতির উন্নতি দেবে, যেমনটি নীচে দেখানো হয়েছে।
দ্বিতীয় প্রতিশ্রুতি (রিয়েললক এড়িয়ে চলুন):
পরিমাপিত উন্নতি
প্রত্যাশিত হিসাবে, কেবল মধ্যবর্তী গণনা পুনঃব্যবহার করে এবং এর ফলে অভ্যন্তরীণভাবে বলা ফাংশনের মধ্যে অপ্রয়োজনীয় গণনা এবং বরাদ্দ হ্রাস করে, আমরা Redis স্ট্রীমের ~=20% এর সামগ্রিক CPU সময় হ্রাস করেছি।
আমরা বিশ্বাস করি যে এটি একটি উদাহরণ যে পদ্ধতিগত সহজ উন্নতিগুলি কার্যক্ষমতাতে উল্লেখযোগ্য বাধা সৃষ্টি করতে পারে, এমনকি Redis এর মতো ইতিমধ্যেই গভীরভাবে অপ্টিমাইজ করা কোডের জন্যও।
আমাদের লক্ষ্য হল Redis-এর কার্যক্ষমতার দৃশ্যমানতাকে প্রসারিত করা, এবং সংস্থা এবং ব্যক্তি সহ শিল্প এবং একাডেমিয়া উভয়ের সদস্যদের অবদান রাখতে উৎসাহিত করা হয়। আমরা যদি এটি পরিমাপ না করি তবে আমরা এটিকে উন্নত করতে পারব না।