রেডিস পারফরম্যান্সের ওপর জোর দিয়ে ডেভেলপ করা হয়েছে। আমরা প্রতিটি রিলিজে আমাদের সেরা দিয়েছি যাতে আপনি একটি খুব স্থির এবং দ্রুত প্রোডাক্ট এক্সপেরিয়েন্স করেন।
তবুও, যদি আপনি রেডিসের দক্ষতা উন্নত করার সুযোগ খুঁজে পান বা পারফরম্যান্স রিগ্রেশন ইনভেস্টিগেশন চালান, তবে আপনাকে রেডিসের পারফরম্যান্স মনিটরিং এবং অ্যানালাইসিস করার একটি সংক্ষিপ্ত পদ্ধতিগত উপায় প্রয়োজন হবে। এটি সেসব অপ্টিমাইজেশনের একটির গল্প।
শেষে, আমরা স্ট্রিমের ইনজেস্ট পারফরম্যান্স প্রায় ২০% উন্নত করেছি, একটি উন্নতি যা আপনি ইতিমধ্যে রেডিস v7.0-এ নিতে পারেন।
একটি মানক SPEC
অপ্টিমাইজেশনে ঝাঁপ देने আগে, আমরা আপনাকে একটি হাই-লেভেল আইডিয়া দিতে চাই কিভাবে আমরা এখানে পৌঁছেছি।
উল্লিখিত পূর্বে, আমরা রেডিস পারফরম্যান্স রিগ্রেশন এবং/অথবা অন-সিপিইউ পারফরম্যান্স উন্নতির সুযোগ চিহ্নিত করতে চাই। এটি করার জন্য, আমরা পারফরম্যান্স এবং অবজার্ভেবিলিটি রিকোয়ারমেন্ট এবং এক্সপেকটেশন সম্পর্কে সব বিষয়ে ক্রস-কোম্পানি এবং ক্রস-কমিউনিটি স্ট্যান্ডার্ডের একটি সেট পোষণ করার প্রয়োজন মায়ন করেছিলাম।
সংক্ষেপে, আমরা ক্রমাগত SPEC-এর বেঞ্চমার্ক চালাই ব্রাঞ্চ/ট্যাগ দ্বারা ভেঙে এবং ফলস্বরূপ পারফরম্যান্স ডেটা ইন্টারপ্রেট করি যাতে প্রোফাইলিং টুলস/প্রোবের আউটপুট এবং ক্লায়েন্ট আউটপুট থাকে একটি "জিরো-টাচ" ফুলি অটোমেটেড মোডে।
ব্যবহৃত যন্ত্রপাতি সব ওপেন সোর্স এবং memtier_benchmark, redis-benchmark, Linux perf_events, bcc/BPF ট্রেসিং টুলস, এবং ব্রেন্ডন গ্রেগের FlameGraph রেপো seperti পপুলার টুলস/ফ্রেমওয়ার্কের ওপর নির্ভর করে।
যদি আপনি রেডিসের সাথে প্রোফাইলার কীভাবে ব্যবহার করি সেটি বিস্তারিত জানতে চান, আমরা আমাদের অত্যন্ত বিস্তারিত "অন-সিপিইউ প্রোফাইলিং এবং ট্রেসিং-এর জন্য পারফরম্যান্স ইঞ্জিনিয়ারিং গাইড।" পড়তে সুপারিশ করি।
ডুপ্লিকেট কম্পিউটেশন এড়িয়ে পারফরম্যান্স উন্নত করা
এই প্রথম ধাপ দেয়ার সাথে সাথে, আমরা প্রোফাইলিং টুলস/প্রোবের আউটপুট ইন্টারপ্রেট করা শুরু করলাম। বেঞ্চমার্কগুলোর মধ্যে একটি যেটি একটি আকর্ষণীয় প্যাটার্ন দেখিয়েছিল সেটি স্ট্রিমের ইনজেস্টেড বেঞ্চমার্ক যা সিম্পলি একটি স্ট্রিমে ডেটা ইনজেস্ট করে একটি কমান্ডের মতো নিচের সাথে:
`XADD key * field value`
আমরা পর্যবেক্ষণ করেছি যে যখন একটি আইডি ছাড়া স্ট্রিমে যোগ করা হয়, তবে এটি SDS তৈরি/ফ্রি/এসডিএসলেন-এ ডুপ্লিকেট কাজ সৃষ্টি করে যা প্রায় ১০% সিপিইউ সাইকেল খরচ করে, যা পরবর্তী দুটি perf রিপোর্ট প্রিন্টে বিস্তারিত দেখানো হয়েছে।

একই ইনপুটের জন্য, sdscatfmt এবং _sdsnewlen দুবার কল করা হচ্ছিল:

এটি আমাদের স্ট্রিম ইনজেশন অপ্টিমাইজ করতে সক্ষম করলো প্রায় ৯-১০% যেন নিচের বেঞ্চমার্ক ফলাফল দিয়ে কনফার্ম করা গেছে:
অনস্টেবল ব্রাঞ্চে বেসলাইন (6b403f5) :
এই PR-এর প্রথম কমিট (ডুপ কাজ এড়াতে):

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

পরিমাপকৃত উন্নতি

আশা অনুযায়ী, শুধু ইন্টারমিডিয়েট কম্পিউটেশন পুনঃব্যবহার করে এবং ফলস্বরূপ আંતরিকভাবে কল করা ফাংশনগুলোর মধ্যে রিডান্ডেন্ট কম্পিউটেশন এবং অ্যালোকেশন কমিয়ে, আমরা রেডিস স্ট্রিমের সামগ্রিক সিপিইউ টাইমে ~= ২০% রিডাকশন পরিমাপ করেছি।
আমরা বিশ্বাস করি এটি একটি উদাহরণ যে কীভাবে পদ্ধতিগত সিম্পল উন্নতিগুলো ইতিমধ্যে গভীরভাবে অপ্টিমাইজড কোডের মতো রেডিসের মতোেও উল্লেখযোগ্য পারফরম্যান্স বাড়াতে পারে।
আমাদের লক্ষ্য হলো রেডিসের পারফরম্যান্স ভিজিবিলিটি আমাদের প্রসারিত করা, এবং ইন্ডাস্ট্রি এবং একাডেমিয়া থেকে সদস্যদের, সংস্থা এবং ব্যক্তিদের, অবদান রাখতে উৎসাহিত করা। যদি আমরা পরিমাপ না করি, তবে আমরা উন্নত করতে পারব না।