কম্পিউটার টিউটোরিয়াল

Apache JMeter দিয়ে রেইলস অ্যাপ ইফেক্টিভলি লোড টেস্ট করা

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

  • ইউজার আচরণ অপ্রেডিক্টেবল (unpredictable) হতে পারে;
  • ইউজাররা ভিন্ন ভিন্ন লোকেশন থেকে ডিস্ট্রিবিউটেড (distributed) থাকতে পারে;
  • একই সময়ে প্রচুর সংখ্যক ইউজার অ্যাপ্লিকেশন ব্যবহার করতে পারে।

বড় স্কেলের অ্যাপ্লিকেশনের জন্য, এই জিনিসগুলো ফুল-ফ্লেজড (full-fledged) রিলিজ করার আগে জানা খুব গুরুত্বপূর্ণ। আমাদের অ্যাপ্লিকেশন আশা অনুযায়ী কাজ করছে কিনা নিশ্চিত করতে, ফাংশনালিটি রোল আউট করার সময় কিছু জিনিস বিবেচনা করতে হবে:

  • ফেজড রোলআউট (Phased rollout) - ফেজড রোলআউটে, অ্যাপ্লিকেশন ছোট একটি ইউজার পোर्शन দ্বারা টেস্ট করা যায় সবার অ্যাক্সেস দেওয়ার আগে। এটি ইউজার আচরণ নির্ধারণ করতে সাহায্য করে।
  • লোড টেস্টিং (Load testing) - ফেজড রোলআউটে ইউজার আচরণ নির্ধারণ করা যায়, কিন্তু আমরা জানতে পারি না প্ল্যাটফর্ম কীভাবে কাজ করে যখন অনেক ইউজার একসাথে বিভিন্ন লোকেশন থেকে অ্যাপ্লিকেশন ব্যবহার করে।

লোড টেস্টিং কী, এবং এটি পারফরম্যান্স টেস্টিং থেকে কিভাবে ভিন্ন?

নিচের তিনটি টার্ম একসাথে শুনতে সিমিলার লাগতে পারে, কিন্তু তারা ভিন্ন:

  • পারফরম্যান্স টেস্টিং (Performance Testing),
  • লোড টেস্টিং (Load Testing), এবং
  • স্ট্রেস টেস্টিং (Stress Testing)।

পারফরম্যান্স টেস্টিং হলো একটি জেনারেল টেস্টিং মেকানিজম যা অ্যাপ্লিকেশন কীভাবে পারফর্ম করে একটি দিয়ে गये ইনপুটের সাথে আसेস (assess) করতে ব্যবহৃত হয়। এটি সিংগেল ইউজার বা মাল্টিপল ইউজারের সাথে করা যায়। এটি কিছু মেট্রিক্স অसेস করার জন্য করা হয়, যেমন রেসপন্স টাইম এবং CPU/মেমরি ইউজেজ। লোড/স্ট্রেস টেস্টিং পারফরম্যান্স টেস্টিং-এর একটি সাবসেট (subset)।

লোড টেস্টিং করা হয় নিশ্চিত করার জন্য অ্যাপ্লিকেশন আশা অনুযায়ী পারফর্ম করছে কিনা একটি স্পেসিফাইড সংখ্যক ইউজার কনকারেন্টলি (concurrently) অ্যাপ্লিকেশন ব্যবহার করছে একটি স্পেসিফাইড.Length of time-এর জন্য। এটি সিস্টেম কত ইউজার হ্যান্ডেল করতে পারে সেটি নির্ধারণ করতে সাহায্য করে।

স্ট্রেস টেস্টিং এবং লোড টেস্টিং একে অপরের সাথে ঘনিষ্ঠভাবে সম্পর্কিত। স্ট্রেস টেস্টিং লোড টেস্টিং-এর মত মেকানিজম দিয়ে করা যায়, কিন্তু টেস্টিংয়ের গোল (goal) ভিন্ন। লোড টেস্টিংয়ের গোল হলো আমাদের অ্যাপ্লিকেশন স্পেসিফাইড সংখ্যক ইউজারের সাথে কাজ করে কিনা সেটি নির্ধারণ করা, যখন স্ট্রেস টেস্টিং করা হয় অ্যাপ্লিকেশন কীভাবে behave করে এবং ফেইলিউর হ্যান্ডেল করে লোড লিমিট হিট হলে।

র‍্যাম্প-আপ পিরিয়ড (ramp-up period) এর ভিত্তিতে, পারফরম্যান্স টেস্টিং ক্যাটাগরাইজ করা যায় হয় স্পাইক টেস্ট (spike test) অথবা সোক টেস্ট (soak test) হিসেবে। কম সময়ে হঠাৎ ইউজার বেড়ে যাওয়া স্পাইক টেস্ট, এবং লম্বা ডুরেশনে ধীরে ধীরে ইউজার বেড়ে যাওয়া সোক টেস্ট।

কেন পারফরম্যান্স টেস্টিং গুরুত্বপূর্ণ?

Rails প্রজেক্টের একটিয়, আমরা ভবিষ্যতে ইউজার গ্রোথের большое আশা করছিলাম। আমরা নিশ্চিত করতে চেয়েছিলাম অ্যাপ্লিকেশন আশা অনুযায়ী পারফর্ম করছে এবং গুরুত্বপূর্ণ ফাংশনালিটি লост (lost) হচ্ছে না বড়া ইউজার সংখ্যার সাথে। তাহলে, কীভাবে নিশ্চিত করব? আমরা লোড টেস্ট পারফর্ম করলাম এবং চেক করলাম অ্যাপ্লিকেশন দিয়ে गये ইউজার বৃদ্ধি হ্যান্ডেল করতে পারে কিনা। পারফরম্যান্স টেস্টিং অন্য অনেক কেসে গুরুত্বপূর্ণ হতে পারে:

  • যদি অ্যাপ্লিকেশনে কোনো স্পেসifik দিনে ইউজার স্পাইক আশা করা হয়, যেমন ব্ল্যাক ফ্রাইডে (Black Friday), সংক্ষিপ্ত র‍্যাম্প-আপ পিরিয়ড সহ স্পাইক টেস্টিং অ্যাপ্লিকেশন করলে সিস্টেমে পটেনশিয়াল ইস্যু খুঁজে বের করতে সাহায্য করে।
  • লোড টেস্টিং সিস্টেমে সেই বাগগুলো আইডেন্টিফাই করতে সাহায্য করে যা কম ইউজার থাকলে ভিজিবল (visible) নয় বা খুব মিনিমাল।
  • এটি আমাদের ইভ্যালুয়েট করতে দেয় প্ল্যাটফর্মের স্পীড কীভাবে প্রভাবিত হচ্ছে বড়া লোডের কারণে। অ্যাপ্লিকেশন স্লো হলে, কাস্টমার হারাতে পারি।
  • এটি অसेস করতে সাহায্য করে আমাদের সিস্টেম বড় লোডের নিচে কীভাবে কাজ করে এবং সিস্টেম ক্র্যাশ করে কিনা হাই CPU বা মেমরি ইউজেজের কারণে ১০,০০০ ইউজার থাকলে।
  • স্পেসিফাইড সংখ্যক ইউজারের জন্য অ্যাপ্লিকেশন চালানোর খরচ লোড টেস্টিং দিয়ে নির্ধারণ করা যায়।

আমরা আমাদের রেইলস অ্যাপে লোড টেস্ট পারফর্ম করার সময় একটি বাগ খুঁজে পেলাম। আমি একটি সিমিলার সিনেরিও বর্ণনা করব যেখানে আমরা একটি ইস্যু আইডেন্টিফাই করলাম। একটি হোটেল বুকিং অ্যাপে একটি ওপেন বুকিং প্রসেস ছিল, এবং যখন কয়েকজন ইউজার রুম বুক করতে চেয়ে, সব ঠিকঠাক ছিল। কিন্তু, যখন একাধিক ইউজার একই রুম বুক করতে চেয়েছিল, দুইজন ভিন্ন ইউজার সফলভাবে বুক করতে পারল। আমাদের অ্যাপ লোড টেস্ট করলে, আমরা সমস্যাটি আইডেন্টিফাই করলাম এবং ফিচার রিলিজ করার আগে আর্লি স্টেজে (early stage) ফিক্স করলাম।

Apache JMeter দিয়ে রেইলস অ্যাপ লোড টেস্ট

JMeter হলো Apache 2.0-লাইসেন্সড ওপেন-সোর্স লোড টেস্টিং টুল। এটি থ্রেড-ভিত্তিক (thread-based) লোড টেস্টিং প্রদান করে। থ্রেড-ভিত্তিক টেস্টিং-এ, আমরা সহজে সিমুলেট করতে পারি স্ট্রেস যা আমাদের সিস্টেমের ওপর পড়বে যখন অনেক ইউজার একসাথে আমাদের অ্যাপ্লিকেশন ব্যবহার করবে। JMeter टेस्ट রেজাল্টের ভালো রিপোর্টিংও প্রদান করে।

আমরা দেখব Apache JMeter কীভাবে ব্যবহার করে লোড টেস্ট পারফর্ম করা যায় সিস্টেমের পটেনশিয়াল ইস্যু এবং আমাদের অ্যাপ্লিকেশনের রেসপন্স টাইম আইডেন্টিফাই করতে বয়োর ইউজার সিমুলেট করে।

JMeter ডাউনলোড করা যায় নিচের লিংক থেকে: https://jmeter.apache.org/download_jmeter.cgi#binaries

JMeter টার্মিনোলজি

  • Test Plan (টেস্ট প্ল্যান) টেস্ট প্ল্যান হলো টপ-লেভেল জিনিস যার ভিতরে লোড টেস্টিং কম্পোনেন্টগুলো ডিফাইন করা হয়। গ্লোবাল কনফিগ এবং ভেরিয়েবল এখানে ডিফাইন হয়।
  • Thread Group (থ্রেড গ্রুপ) থ্রেড এবং কনফিগ ডিফাইন করতে ব্যবহৃত হয়, যেমন থ্রেডের সংখ্যা, র‍্যাম্প-আপ পিরিয়ড, থ্রেডের মধ্যে ডিলে, এবং লুপ। এটিকে আপনি প্যারালেল ইউজারের সংখ্যা হিসেবে বিবেচনা করতে পারেন যাদের সাথে লোড টেস্ট রান করতে চান।
  • Sampler (স্যাম্পলার) একটি সিঙ্গেল থ্রেড যা এক্সিকিউট করে। বিভিন্ন টাইপের স্যাম্পলার আছে, যেমন HTTP রিকোয়েস্ট, SMTP রিকোয়েস্ট, বা TCP রিকোয়েস্ট।
  • Pre/Post Processor (প্রি/পোস্ট প্রসেসর) স্যাম্পলার রান হওয়ার আগে বা পরে কিছু এক্সিকিউট করতে ব্যবহৃত হয়। পোস্ট-প্রসেসর একটি API কলের রেসপন্স ডেটা নেওয়ায় পরেরটিতে ব্যবহার করার জন্য পাস করতে পারে।
  • Listener (লিসেনার) স্যাম্পলার থেকে রেসপন্স শোনে এবং রেসপন্স টাইম বা প্রতিটি থ্রেড থেকে রেসপন্সের অ্যাগ্রিগেটেড (aggregated) রিপোর্ট দেয়।
  • Assertion (অসারশন) স্যাম্পলার থেকে রেসপন্স ডেটা আশা অনুযায়ী কিনা সেটি ভ্যালিডেট (validate) করতে উপকারী।
  • Config Element (কনফিগ এলিমেন্ট) কনফিগারেশন ডিফাইন করে, যেমন HTTP হেডার, HTTP কুকি, বা CSV ডেটাসেট কনফিগারেশন।

একটি লোড টেস্ট রান করতে, আমাদের প্রথমে একটি JMX ফাইল তৈরি করতে হবে যেখানে উপরে বর্ণিত JMeter টার্মিনোলজিগুলো ডিফাইন করা থাকবে।

JMX ফাইল প্রস্তুত করা লোড টেস্টের জন্য

JMX হলো JMeter প্রজেক্ট ফাইল XML ফরম্যাটে লেখা। ম্যানুয়ালি JMX ফাইল লিখা কঠিন হতে পারে, তাই আমরা JMeter ইন্টারফেস ব্যবহার করব ফাইলটি তৈরি করার জন্য।

JMeter ইন্টারফেস খুলুন এবং টেস্ট প্ল্যান লোকেট করুন। টেস্ট প্ল্যানের ভিতরে, আমরা থ্রেড এবং এর লোড টেস্ট কনফিগ যোগ করব।

Apache JMeter দিয়ে রেইলস অ্যাপ ইফেক্টিভলি লোড টেস্ট করা JMeter ইন্টারফেস টেস্ট প্ল্যান তৈরি করার জন্য

টেস্ট প্ল্যানকে রিনেম করা যায় আমরা কী লোড টেস্ট করছি সেটি অনুযায়ী। এখানে ডিফল্ট সেটিংস রাখুন এবং থ্রেড গ্রুপ তৈরি করুন।

Add -> Threads(Users) -> Thread Group

থ্রেড গ্রুপে, ডিফল্টভাবে একটি থ্রেড স্পেসিফাইড থাকবে। সিমুলেট করার ইউজার সংখ্যা অনুযায়ী সংখ্যা পরিবর্তন করুন।

যেহেতু আমরা একটি ওয়েব-ভিত্তিক রেইলস অ্যাপ লোড টেস্ট করব, আমরা একটি HTTP স্যাম্পলার যোগ করব। আমরা একটি স্যাম্পলার যোগ করব, যা একটি ThreadGroup-এর ভিতরে থাকবে। নিচের পথ ধরে HTTP Sampler যোগ করুন:

Add -> Sampler -> HTTP Request

এখানে, আমরা যে IP বা ডোমেনে লোড টেস্ট করব সেটি এবং HTTP মেথড এবং HTTP এন্ডপয়েন্টের জন্য যেকোনো রিকোয়েস্ট বডি কনফিগার করব।

শেষে, লোড টেস্টের রিপোর্ট দেখার জন্য, একটি লিসেনার যোগ করুন থ্রেড গ্রুপে।

Add -> Listener -> View Result Tree

View result tree প্রতিটি থ্রেডের রেসপন্স টাইম দেখাবে। আমরা এখানে অন্য রিপোর্টও যোগ করতে পারি। 'View result tree' শুধু ডিবাগিং প্রপোজে ব্যবহার করা উচিত, একচুয়াল টেস্টিং-এ নয়।

এভাবে, আমরা একটি সিম্পল টেস্ট প্ল্যান তৈরি করে এক্সিকিউট করতে পারি। সিম্পলি JMeter-র টপ বারের প্লে আইকনে ক্লিক করুন টেস্ট এক্সিকিউট করতে।

রেইলস অ্যাপ লোড টেস্ট করার আগে বিবেচ্য বিষয়

উপরোক্ত উদাহরণ খুব সিম্পল, সিংগেল এন্ডপয়েন্ট HTTP রিকোয়েস্ট। আমাদের রেইলস অ্যাপের কেসে, যে এন্ডপয়েন্টগুলো টেস্ট করতে চাই সেগুলো অথেন্টিকেশন দিয়ে লকড (locked)। তাই, আমাদের নিশ্চিত করতে হবে নিচের জিনিসগুলো inplace আছে:

  • Web cookie (ওয়েব কুকি) - HTTP এন্ডপয়েন্টগুলোর কুকি হেডার থাকতে হবে লোড টেস্ট পারফর্ম করার আগে। JMeter লগইন হওয়ার পর কুকি যোগ করার ফাংশনালিটি দেয়। পরবর্তী সেকশনে, আমরা দেখব কীভাবে ব্রাউজার রিকোয়েস্ট রেকর্ড করে JMX ফাইল তৈরি করা যায় লোড টেস্টের জন্য। কুকি রেকর্ডিংও কভার করব।
  • Rails CSRF টোকেন - রেইলস অ্যাপকে সিকিউরিটি ভালনারেবিলিটি থেকে রক্ষা করার জন্য CSRF টোকেন দেয়, তাই নিশ্চিত করতে হবে আমাদের রিকোয়েস্টে CSRF অথেন্টিকেশন হেডারে আছে লোড টেস্ট করার আগে। এই CSRF টোকেন HTML-এ meta ট্যাগের ভিতরে header-এ থাকে।

Rails CSRF Token JMeter-এ ফেচ করা যায় একটি পোস্ট-প্রসেসর ব্যবহার করে। HTTP Request-এ রাইট-ক্লিক করুন যা সি পেজ লোড করে যেটিতে CSRF টোকেন আছে, এবং সিলেক্ট করুন Add -> Post Processor -> Regular Expression Extractor। এখানে, নিচের র‍েগুলার এক্সপ্রেশন এক্সট্র্যাক্টর কনফিগ যোগ করুন CSRF ভ্যালু হেডার মেটা ট্যাগ থেকে পড়তে:

  • Reference Name: csrf_value
  • Regular Expression: name="csrfToken" content="(.+?)"
  • Template: $1$
  • Match No: 1

এখন, ভেরিয়েবল csrf_value রিকোয়েস্ট করার জন্য ব্যবহার করা যাবে।

ব্রাউজার থেকে রিকোয়েস্ট রেকর্ড করে JMX ফাইল তৈরি

কম HTTP এন্ডপয়েন্ট থাকলে, JMeter ইন্টারফেস থেকে JMX ফাইল তৈরি করা সিম্পল। কিন্তু, বড় টেস্ট কেসের জন্য, এটি কঠিন হতে পারে। এছাড়া, চান্স আছে আকচুয়াল রিকোয়েস্টগুলো মিস করা যায় যখনি একজন ইউজার অ্যাপ্লিকেশন ব্যবহার করে। আমরা চাই ব্রাউজার থেকে আকচুয়াল রিকোয়েস্টগুলো রেকর্ড হয় এবং JMX ফাইল অটোমেটিক্যালি তৈরি হয়।

JMeter কে রেইলস অ্যাপ এবং ব্রাউজারের মাঝপথে একটি প্রক্সি (proxy) হিসেবে যোগ করা যায়। এর সাথে, সকল রিকোয়েস্ট JMeter দ্বারা রেইলস সার্ভারে ফরওয়ার্ড হবে। এটি MITM (man in the middle) আটাক ও বলা হয়।

Apache JMeter দিয়ে রেইলস অ্যাপ ইফেক্টিভলি লোড টেস্ট করা JMeter রেকর্ডিং

JMeter-এ রেকর্ডিং তৈরি করতে, যান file -> templates -> recording এবং Create-এ ক্লিক করুন। যে হোস্টনেম রেকর্ড করছেন সেটি স্পেসিফাই করুন। এটি অটোমেটিক্যালি কিছু জিনিস জেনারেট করবে আপনার জন্য, যার মধ্যে কুকি ম্যানেজার (cookie manager)। কুকি ম্যানেজার অথেন্টিকেশনের জন্য প্রয়োজনীয় কুকি সংরক্ষণ করবে।

JMeter SSL সার্টিফিকেট দিয়ে HTTPS রিকোয়েস্ট ভেরিফাই

এই রিকোয়েস্ট আমরা ব্রাউজার থেকে করব যা JMeter-এ ফরওয়ার্ড হবে, এবং JMeter এটিকে ওয়েব সার্ভিসে ফরওয়ার্ড করবে এবং রিকোয়েস্টগুলো রেকর্ড করবে যাতে আমরা JMeter রেকর্ডিং থেকে লোড টেস্ট রান করতে পারি। যদি অ্যাপ্লিকেশন HTTPS প্রোটোকল রিকোয়ার করে SSL কানেকশনের জন্য, তবে একটি সার্টিফিকেট ব্রাউজারে যোগ করতে হবে। সার্টিফিকেট যোগ করতে, Firefox বা অন্য ব্রাউজার খুলুন। Firefox-এ, যান Settings > Privacy > Manage certificate এবং JMeter সার্টিফিকেট যোগ করুন যাতে ব্রাউজার JMeter দ্বারা জেনারেটেড সার্টিফিকেট রিকগনাইজ (recognize) করে।

cmd + sht + g চাপুন এবং পথ দিন /usr/local/Cellar/jmeter/5.2/libexec/bin/jmeter সার্টিফিকেট যোগ করার জন্য।

ফায়ারফক্স কনফিগার করা JMeter প্রক্সি হিসেবে

এরপর, আমাদের ফায়ারফক্স থেকে রিকোয়েস্ট ফরওয়ার্ড করতে হবে আমাদের JMeter রেকর্ডিং স্ক্রিপ্টে। এটি করা যায় ফায়ারফক্সে প্রক্সি কনফিগার করে। Firefox খুলুন এবং যান Preferences -> Advanced -> Connection(settings)। এখানে, HTTP Proxy সেট করুন "localhost" এবং পোর্ট "8080" এবং চেক করুন "Use this proxy server for all protocols"।

এখন, আমরা JMeter-এ যাব এবং টেমপ্লেট থেকে যেটি বেছে নিয়েছিলাম সেটির Script recording সেকশনে। একবার Start বাটনে ক্লিক করলে, JMeter ইনকামিং রিকোয়েস্ট এক্সেপ্ট (accept) করা শুরু করবে। যখন আমরা Firefox-এ যাব এবং যে অ্যাপ্লিকেশন লোড টেস্ট করছি সেটি ব্রাউজ করব, এটি রেকর্ড করবে এবং JMX ফাইলে কনভার্ট করবে, যেটি আমরা লোড টেস্টের জন্য রান করতে পারি।

JMeter দিয়ে ডিস্ট্রিবিউটেড লোড টেস্টিং

টেস্ট রান করার সময়, আমরা আমাদের লোকাল মেশিনের একটি থেকে টেস্ট পারফর্ম করতে পারি। টেস্ট প্ল্যান প্রস্তুত করার সময় এটি ঠিক, কিন্তু একচুয়াল টেস্ট রান করার সময়, আমাদের এটা পরিবর্তন করতে হবে। একক মেশিন থেকে লোড টেস্ট পারফর্ম করলে হার্ডওয়্যার লিমিটেশন (CPU এবং মেমরি) এবং রিকোয়েস্ট লোকেশন লিমিটেশন থাকবে। এই টেস্টগুলো আকচুয়াল ইউজার অ্যাপ্লিকেশন ব্যবহার করার ট্রাফিক সিমুলেট করার জন্য করা হয়। এই উদ্দেশ্যে, আমাদের টেস্টগুলো আলাদা সার্ভারগুলোর মধ্যে ডিস্ট্রিবিউট করতে হবে এবং একটি সিঙ্গেল প্লেস থেকে সকল রেজাল্ট ভিউ করতে হবে।

JMeter একটি প্রাইমারি নোড (primary node) প্রদান করে টেস্ট অর্কেস্ট্রেট (orchestrate) করার জন্য এবং একাধিক সেকেন্ডারি নোড (secondary nodes) টেস্ট রান করার জন্য। এটি আকচুয়াল ইউজার অ্যাপ্লিকেশন ব্যবহার করার সিমুলেট করতে সাহায্য করে। আমরা টেস্টিং সার্ভারগুলো আপনার আকচুয়াল ইউজারদের কাছে ভিন্ন রিজনে ডিস্ট্রিবিউট করতে পারি।

Apache JMeter দিয়ে রেইলস অ্যাপ ইফেক্টিভলি লোড টেস্ট করা JMeter ডিস্ট্রিবিউটেড টেস্টিং

একটি ডিস্ট্রিবিউটেড টেস্ট পারফর্ম করতে, শুরু করুন প্রাইমারি এবং সেকেন্ডারি উভয় সার্ভারে JMeter ইনস্টল করে।

সেকেন্ডারি সার্ভারে করার জিনিস:

  • jmeter/bin-এ যান এবং jmeter-server কমান্ড এক্সিকিউট করুন। এটি টেস্ট এক্সিকিউট করার সার্ভার শুরু করবে।
  • যদি টেস্টের জন্য যেকোনো CSV ইনপুট দরকার হয়, সেসব ফাইল এই সার্ভারে যোগ করুন।

প্রাইমারি সার্ভারে করার জিনিস:

  • jmeter/bin ডিরেক্টরিতে যান এবং jmeter.properties ফাইল খুলুন।
  • remote_hosts কন্টেইন করার লাইনটি এডিট করুন এবং সেকেন্ডারি সার্ভারদের IP কমা দিয়ে সেপারেট করে যোগ করুন remote_hosts=,।
  • JMeter টেস্ট রান করুন।

সেকেন্ডারি সার্ভার একচুয়াল টেস্ট রান করার জন্য দায়বদ্ধ, এবং প্রাইমারি সার্ভার রিপোর্টগুলো অ্যাগ্রিগেট করবে।

লোড টেস্টিং পারফর্ম করতে, আমাদের সবসময় CLI কমান্ড ব্যবহার করা উচিত UI থেকে ট্রিগার করার বদলে, কারণ এটি লোড টেস্টিং সার্ভারগুলোর জন্য পারফরম্যান্স প্রোব্লেম করতে পারে। আমরা JMeter কমান্ড ব্যবহার করি JMX ফাইলনেম স্পেসিফাই করে:

> jmeter -n -t path/to/test.jxm -r

অথবা

> jmeter -n -t path/to/test.jxm -R s1_ip,s2_ip,…

-r jmeter.properties-এ স্পেসিফাইড রিমোট সার্ভার ব্যবহার করে

-n GUI মোড ছাড়া রান করবে

-t jmx ফাইলের পথ

Puma বনাম Unicorn: কীভাবে বেছে নিলাম

Puma এবং Unicorn রেইলসের জন্য দুটি ভিন্ন ওয়েব সার্ভার। দুটোরই সুবিধা আছে, তাহলে কোনটি সেরা সেটি কীভাবে ডিসাইড করব? এটা অ্যাপ্লিকেশনের ওপর নির্ভর করে। কিছু অ্যাপ্লিকেশন Unicorn-এ ভালো কাজ করে, আর কিছু Puma-এ। আমাদের একটি রেইলস অ্যাপের জন্য Unicorn এবং Puma-এর মধ্যে বেছে নিতে হয়েছিল, এবং আমরা লোড টেস্ট থেকে প্রাপ্ত ডেটার ভিত্তিতে সেটি করলাম। আমরা একবার Unicorn দিয়ে রেইলস অ্যাপে লোড টেস্ট করলাম এবং অন্যবার Puma দিয়ে। একমাত্র জিনিস যা আমরা পরিবর্তন করলাম সেটি রেইলস অ্যাপের ওয়েব সার্ভার।

এই টেস্ট থেকে আমরা নিচের রেজাল্ট পেলাম: Apache JMeter দিয়ে রেইলস অ্যাপ ইফেক্টিভলি লোড টেস্ট করা Puma এবং Unicorn-এর রেসপন্স টাইম পার্থক্য

আমরা পেলাম Puma আমাদের রেইলস অ্যাপের জন্য ভালো পারফর্ম করছে যখন প্ল্যাটফর্মে বড় সংখ্যক ইউজার থাকে। এর মানে আমরা কম অ্যাপ্লিকেশন সার্ভারের সাথে বেশি ইউজার হ্যান্ডেল করতে পারব।

নোট: এটি সার্ভার ইনস্ট্যান্স টাইপ এবং অ্যাপ কী ধরণের বিজনেস লজিক প্রসেস করে সেটির ওপর নির্ভর করে।

রেইলস অ্যাপ স্ট্রেস দেওয়ার সময় সাধারণ ফেইলিউর এবং সমাধান

  • অনঅপ্টিমাইজড ডাটাবেস কুয়েরি
    • N+1 কুয়েরি সমস্যা দূর করুন।
    • অ্যাক্সেস প্যাটার্ন অনুযায়ী ইনডেক্স যোগ করুন।
    • ডাটাবেসের সামনে Redis-মত ক্যাশিং লেয়ার ব্যবহার করুন।
  • স্লো রুবি কোড পারফরম্যান্স
    • মেমোআইজ (memoize) করে কোড অপ্টিমাইজ করুন।
    • O(n^2) কমপ্লেক্সিটি বের করুন এবং অপ্টিমাল অ্যালগরিদম ব্যবহার করুন।
  • মাইক্রোসার্ভিস আর্কিটেকচারে, সার্ভিসগুলোর মধ্যে অনেক HTTP কল হতে পারে। নেটওয়ার্ক কল স্লো।
    • মেসেজিং সিস্টেম ব্যবহার করে মাইক্রোসার্ভিসের জন্য HTTP কল সংখ্যা কমান।
  • কনকারেন্ট्ली তৈরি হলে একই রেকর্ড দুইবার তৈরি হয়।
    • ডাটাবেস ইউনিক কনস্ট্রেইন্ট (unique constraint) যোগ করুন।
    • FIFO ইভেন্ট (কিউ)-ভিত্তিক রিসোর্স ক্রিয়েশন ব্যবহার করুন।
  • সম্ভব হলে ব্যাকগ্রাউন্ড প্রসেসিং (যেমন Sidekiq) ব্যবহার করুন।
  • API রেসপন্স টাইমের জন্য SLA ডিফাইন করুন এবং পারফরম্যান্স টেস্টিং ডেভেলপমেন্ট লাইফসাইকেলের অংশ করুন।

কোন এনভায়রনমেন্ট লোড টেস্টিং-এ ব্যবহার করা উচিত

প্রোডাকশন এনভায়রনমেন্টে লোড টেস্ট পারফর্ম করা একটি আইডিয়াল চয়েস নয় কারণ এটি প্রোডাকশনে ইস্যু এবং এমনকি ডাউনটাইম সৃষ্টি করতে পারে। আমরা প্রোডাকশন এনভায়রনমেন্টে সমস্যা সৃষ্টি করতে চাই না, কিন্তু আমরা এখনও চাই টেস্ট রিপোর্ট সত্য ডেটা রিফলেক্ট করে, প্রোডাকশনের মত। লোড/স্ট্রেস টেস্টের জন্য, প্রোডাকশনের একটি রেপ্লিকা এনভায়রনমেন্ট (replica environment) তৈরি করা রিকমেন্ডেড। এতে নিচের জিনিসগুলো অন্তর্ভুক্ত:

  • অ্যাপ্লিকেশন সার্ভারların সংখ্যা।
  • ডাটাবেস সার্ভারের হার্ডওয়্যার স্পেসিফিকেশন, রেপ্লিকা সহ।
  • টেস্টিং ডাটাবেসে প্রোডাকশন-মত ডেটা। এতে প্রোডাকশনে আপনার সম্মুখীন হওয়া প্রায় সমান ডেটা ভলিউম থাকা উচিত।

প্রোডাকশন-মত এনভায়রনমেন্ট তৈরি করা চ্যালেঞ্জিং এবং ব্যয়বহুল। তাই, আমরা কী লোড টেস্ট করছি সেটির ওপর ভিত্তি করে, সেই কম্পোনেন্টগুলোর ইনফ্রাস্ট্রাকচারকে প্রোডাকশন-মত আপগ্রেড করা যাবে। এতে খরচ বাঁচবে। প্রতিটি তিন মাসে একবার লোড/স্ট্রেস টেস্ট করা ভালো। তবে, সিংগেল ইউজারের সাথে পারফরম্যান্স টেস্টিং এবং রেসপন্স টাইম ডিফাইন করা স্ট্যান্ডার্ডের (যেমন ২০০ms) অধীনে আছে কিনা ভ্যালিডেট করা কিছু যেটি ডেভেলপমেন্ট সাইকেলে যোগ করা উচিত।

লোড টেস্টিং করার সময়, আমাদের CPU/মেমরি ইউজেজের মত হার্ডওয়্যার KPI-ও দরকার। মেমরি/CPU ইউজেজে স্পাইক অ্যাপ্লিকেশন ক্র্যাশ করতে পারে। হার্ডওয়্যার KPI মাপতে, Prometheus-এর মত মনিটরিং টুলস যোগ করুন লোড টেস্ট শুরু করার আগে।

Apache JMeter একটি শক্তিশালী লোড টেস্টিং টুল। আমরা Apache JMeter ব্যবহার করলাম রেইলস অ্যাপ লোড টেস্ট করতে, কিন্তু এটি যেকোনো স্ট্যাকে বিল্ট অ্যাপ্লিকেশনের লোড/স্ট্রেস টেস্ট করতে ব্যবহার করা যায়। লোড টেস্টিং অ্যাপ্লিকেশনে ডেটা-চালিত (data-powered) ডিসিশন নেওয়াতে সাহায্য করে। লোড টেস্টিং শুনতে ভয়ংকর লাগতে পারে, কিন্তু শুরুতে একটু ইনভেস্টমেন্ট দিয়ে, এটি দীর্ঘমেয়াদে অ্যাপ্লিকেশনে অনেক স্থিতিশীলতা (stability) এবং নির্ভরযোগ্যতা (reliability) যোগ করতে পারে।

  1. পিসি পারফরম্যান্স বাড়ান: অ্যাপ দ্রুত লোড করার সহজ ধাপাবলী

  2. প্রযুক্তি কীভাবে আপনার যোগ অভ্যাসকে উন্নত করতে পারে: ৩টি প্রমাণিত কৌশল

  3. Systweak AppLock দিয়ে অ্যান্ড্রয়েড অ্যাপস আলাদা করে লক করুন – ফিংগারপ্রিন্ট, প্যাটার্ন ও পাসওয়ার্ড

  4. ব্যবসা বাড়াতে সেরা মোবাইল মার্কেটিং অ্যাপ