“(JMeter) আমাজন ক্লাউড কি আমাদের ইউসার বা ব্যবহারকারীর লোড সামলাতে পারবে”? - পর্ব ২

“আমাজন ক্লাউড কি আমাদের ইউসার বা ব্যবহারকারীর লোড সামলাতে পারবে”?  - পর্ব ২
(৫ মে, ২০১৫, মঙ্গলবার)


আগের পর্বে লোড টেস্টিং এর প্রয়োজনীয়তা নিয়ে লিখেছিলাম। আজকের লেখায় চেষ্টা করবো JMeter ইনস্টল করা থেকে শুরু করে একটা টেস্ট স্ক্রিপ্ট লিখে তা কিভাবে রান করতে হয় - তা ধাপে ধাপে লিখতে। সবশেষে যাতে আপনারা আজকেই একটা স্ক্রিপ্ট লিখে তা  টেস্ট করে দেখতে পারেন (এমন কী JMeter ইনস্টল করা ছাড়াই !!) , তার উপায় জানাবো । আগেই বলে নেই, অনেক গুলো ধাপের আমি শুধু লিংক দিয়ে দিব, নতুন করে আর লিখবো না। সে হিসেবে বলতে গেলে আজকের লেখাটা অনেকটা উপকারী লিঙ্কের প্লেস-হোল্ডার বলতে পারেন। আর আপনার যদি পড়তে ভালো না লাগে, তাহলে এই ইউটিউব ভিডিও গুলো দেখে নেবেন, তাহলেও চলবে।
  • সেটআপ:
JMeter  চালানোর জন্য Java ৬ বা তার উপরের ভার্সন লাগে। জাভা ইনস্টল করার পর Jmeter এই লিংক থেকে নামিয়ে নিতে পারেন। প্রথমত: আপনি যেই সিস্টেম লোড টেস্ট করতে চান, তাতে একজন ইউসার -এর ইন্টারঅ্যাকশন রেকর্ড করতে হবে।  পরবর্তীতে এই ইন্টারঅ্যাকশন-ই  আপনি আরো অনেক ইউসার দিয়ে সিমুলেট করবেন, ঠিক না?


এর জন্য প্রক্সি (Proxy) সেটআপ করতে হবে।  ব্যাপারটা খুবই সাধারণ। JMeter -এ আপনি একটা প্রক্সি পোর্ট  চালু করবেন, এরপর আপনার ব্রাউসার (যেমন, ফায়ারফক্স) কে কনফিগার করবেন যেন সব রিকোয়েস্ট সেই পোর্ট দিয়ে পাঠায়। এরপর আপনি আপনার ব্রাউসার এ যাই টাইপ করুন না কেনো, তা Jmeter হয়েই যাবে,  আর এভাবেই Jmeter একজন ইউসার-এর সব ইন্টারঅ্যাকশন (অর্থাৎ, HTTP রিকোয়েস্ট-রেসপন্স)  রেকর্ড করবে। এই প্রক্সি সেটআপটা এই লিংক থেকে পাবেন।


নিচে আমার একটা স্ক্রিপ্ট-এর স্ক্রীনশট দিলাম:






খেয়াল করে দেখুন, আমি ৮১৮১ পোর্ট ব্যবহার করছি। আর স্ক্রিপ্ট রেকর্ডার -কে বলে দিচ্ছি যে bmp, .css, .js ইত্যাদি ফাইল এক্সটেনশন বাদ দিতে। এতে করে সুবিধা হচ্ছে, ফালতু অনেক ফাইল, স্ক্রিপ্টে রেকর্ড হবে না। আর তাই উপরের লিস্টে ১ -এর পর ২৭ নম্বর পেজ রেকর্ড হতে দেখছেন।  আপনার মনে যদি এখন প্রশ্ন আসে যে, .js বা জাভাস্ক্রিপ্ট বাদ দিলে ওয়েবসাইট-এর ডাইনামিক কনটেন্ট কিভাবে পাবো? - তাহলে আপনি ঠিক চিন্তাই করছেন। একটু পরেই বলছি, কী করে তা হ্যান্ডেল করতে হবে।   


  • রিয়েল বা আসল ইউসার/ব্রাউসার সিমুলেশন:
একজন ইউসার যখন কোনো পেজ ভিসিট করে সে কিন্তু কিছুটা সময় ওই পেজ-এ ব্রাউস করে।  সাথে সাথেই ওই পেজের কোনো বাটন ক্লিক করে না।  এই সময় ক্ষেপণ সিমুলেট করা জরুরি। JMeter কে যদি এটা ছাড়াই ৫০০ ইউসার সিমুলেট করতে বলা হয়, তাহলে সে কিন্তু একই সাথে ওই বাটন (আলাদা আলাদা থ্রেড-এ যদিও) ৫০০ বার ক্লিক করে বসবে।


এই রিয়েল সিচুএশন সিমুলেট করতে প্রতি পেজের শুরুতে একটা রান্ডম ওয়েট টাইম যোগ করে দিতে হবে (পেজের উপরে মাউস-এর রাইট বাটন ক্লিক করে Add > Timer > Uniform Random Timer)। আমি যেমন ০ - ৩৫ সেকেন্ড পর্যন্ত রান্ডমলি ওয়েট করে তারপর পরের পেজে যাই। (এ ব্যপারটা আমি জেনেছি এই লিংক থেকে)













[আপডেট: JMeter -র নিজস্ব socket timeout আছে। পেজ ওয়েট টাইম বেশি দিয়ে দিলে আবার JMeter টাইম আউট এরর থ্রো করবে। সকেট টাইম আউট বাড়ানোর জন্য bin ফোল্ডারের ভেতর hc.parameters ফাইলে "http.socket.timeout$Integer=10000" (মিলিসেকন্ডে আছে, অর্থাৎ ১০ সেকেন্ড। প্রয়োজনমত বাড়িয়ে কমিয়ে নিতে হবে) এবং "http.connection.stalecheck$Boolean=true" আন-কমেন্ট করতে হবে (লাইনের শুরুতে "#" মুছে দিলেই আন-কমেন্ট হয়ে যাবে)। এছাড়াও jmeter.properties ফাইল থেকে "hc.parameters.file=hc.parameters" লাইন আন-কমেন্ট করতে হবে। ]

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


সব গুলো পেজের উপরে তাই HTTP Request Default অ্যাড করে দিয়ে কানেকশন সংখ্যা বলে দিতে হয় (বিস্তারিত এই লিঙ্কের ব্লগে আছে)।  
























  • ডাইনামিক অথেনটিকেশন টোকেন
বেশিরভাগ ওয়েবসাইট ডাইনামিক অথেনটিকেশন টোকেন ব্যবহার করে। এক পেজের রিকোয়েস্ট -এর রেসপন্স-এ  সার্ভার এইসব টোকেন HTML -এ এমবেড করে দেয়। পরের পেজ আবার তার রিকোয়েস্ট-এ প্যারামিটার হিসাবে ওই টোকেন পাঠায়।  অনেক সময় একটা পেজ জাভাস্ক্রিপ্ট ব্যবহার করেও এইসব টোকেনের ভ্যালু বা মান ঠিক করে।  এটা ওয়েবসাইট-এর একধরনের সিকিউরিটি মেজার বা পদক্ষেপ।  JMeter  যেহেতু কোনো ব্রাউসার না, তাই এইসব টোকেন তাকে পেজ রেসপন্স থেকে বের করে বা এক্সট্র্যাক্ট করে নিতে হয়। আর তার জন্য রেগুলার এক্সপ্রেশন এক্সট্র্যাক্টর ব্যবহার করতে হবে (মাউস-এর রাইট বাটন ক্লিক করে Add > Post Processors  > Regular Expression Extractor)। উদাহরণ দেই, আমার স্ক্রিপ্টের ২৭ নম্বর পেজ (নিচের ছবিতে), রিকোয়েস্ট প্যারামিটার হিসাবে “org.apache.struts.taglib.html.TOKEN” পাঠায়। আর এর ভ্যালু সে নেয় আগের পেজ থেকে।  তাই, ১ নম্বর পেজে একটা পোস্ট প্রসেসর রেগুলার এক্সট্র্যাক্টর অ্যাড করে আমি এর ভ্যালু বের করে নেই।  











































এই রেগুলার এক্সট্র্যাক্টর -এ আমি মূলত JMeter কে  বলছি, তুমি যখনি পেজে “org.apache.struts.taglib.html.TOKEN" value=" এমন কোনো এক্সপ্রেশন দেখবে,তখনি  তা থেকে ভ্যালু (যা কিছু আছে বোঝাতে “(.+?)” ব্যবহার করে হয়) বের করে নিয়ে এসে token নামের ভ্যারিয়েবল এ রেখে দেবে। ব্যপারটা ভালো করে বুঝতে এই লিঙ্কের লেখা বা এই ইউটুব ভিডিও দেখে নিতে পারেন।   


আরেকটা ব্যাপার হচ্ছে, অনেকসময় এইসব টোকেন স্পেশাল ক্যারেক্টার ব্যবহার করে (যেমন, +, / ইত্যাদি) যা রিকোয়েস্ট পারামিটারকে নষ্ট করে দেয়।  এর জন্য ভালো হচ্ছে JMeter কে বলে দেয়া সে যেন রিকোয়েস্ট পাঠানোর আগে প্যারামিটার এনকোড করে নেয়  (“Encode?”-এ টিক দিয়ে দিলেই হয়)। আমি এই সমস্যায় পড়েছিলাম। এই লিঙ্কে এর সম্পর্কে বিস্তারিত পাবেন।  


এখন, কোনো পেজ পারামিটার হিসেবে কী টোকেন পাঠায় তা সহজে জানা গেলেও, সেই পারামিটার -এর ভ্যালু আগের কোন পেজ থেকে নেয় - এটা বের করা বেশ কষ্টের। আমাদের উদাহরণে ২৭ নম্বর পেজ, ১ নম্বর পেজ (অর্থাৎ আগের পেজ থেকে) থেকে প্যারামিটারের ভ্যালু নিয়েছিল। কিন্তু অনেক সময়ই এটা এত স্ট্রেট-ফরওয়ার্ড হয় না।  এর জন্য পুরো ইন্টারঅ্যাকশন -এর HTTP রিকোয়েস্ট-রেসপন্স ডাম্প করে রাখতে হয়।  আর এই কাজে খুবই উপকারী একটা ফ্রি টুল হচ্ছে ফিডলার বা Fiddler। ডাম্প থেকে পরে ডিবাগ করে করে বের করতে হয় কোন পেজের টোকেন কোন পেজে যাচ্ছে।  


কী ? পড়তে পড়তে টায়ার্ড হয়ে যাচ্ছেন? আর খুব বেশি বাকি নেই। মূল ঝামেলার বিষয় গুলো কিন্তু আমরা ইতিমধ্যে মোটামুটি দেখে ফেলেছি।  

  • স্ক্রিপ্ট ডিবাগ করার পদ্ধতি:
স্ক্রিপ্ট লেখার পর তা ঠিক মত কাজ করছে কিনা দেখার জন্য ডিবাগ করার দরকার হবেই। এর জন্য রেকর্ড করা  প্রতি পেজের পর একটা করে “View Results Tree” লিসেনার অ্যাড করতে হয়। এতে করে  সুবিধা হচ্ছে, ওই পেজের রিকোয়েস্ট-এ কী পাঠানো হয়েছে, আর কীই বা রেসপন্স এসেছে তা দেখা যায়। যেমন, নিচের ছবিতে আমি ‘Response’ ট্যাব আর সাথে HTML সিলেক্ট করে রাখতে ডান পাশে রেসপন্সের ভিউ দেখতে পাচ্ছি।

মনে রাখতে হবে, এই লিসেনার বেশ মেমরি নেয়, তাই ডিবাগ করা হয়ে গেলে, মূল লোড টেস্টার আগে  তা Disable করে রাখা উচিত।
















  • “রাম্পিং আপ ইউসার” বা ব্যবহারকারীর সংখ্যা বাড়ানো:
একজন ইউসার-এর ইন্টারঅ্যাকশন রেকর্ড করার পর অর্থাৎ লোড টেস্ট স্ক্রিপ্ট রেডি হয়ে যাবার পর পরের ধাপ হচ্ছে, ইউসার-এর সংখ্যা বাড়ানো। এটা সেট করতে হয় Thread / Candidate Group -অপশন ব্যবহার করে (নিচের ছবিতে)।  
যেমন, আমার স্ক্রিপ্টে আমি ২০০ ভার্চুয়াল ইউসার কে ৩০০ সেকেন্ড বা ৫ মিনিট ধরে রাম্প-আপ করতে বলেছি। আরো কিছু জিনিস কনফিগার করেছি, যেমন, পুরো স্ক্রিপ্ট প্রতি ইউসার-এর জন্য ১ বার চলবে এবং কোনো এরর হলে শুধু ওই ইউসার (বা থ্রেড) বন্ধ করতে বলেছি। ব্যস, হয়ে গেল, এখন উপরের সবুজ প্লে বাটন ক্লিক করলেই JMeter ২০০ ইউসার দিয়ে লোড তৈরী করবে।  


এখানে বলে রাখা ভালো, এই ভার্চুয়াল ইউসার বা থ্রেড তৈরী করতে প্রচুর মেমরি ব্যবহার হয়।  তাই,JMeter-এর  হীপ সাইজ (Heap size) বাড়িয়ে নিয়ে লোড টেস্ট চালু করা উচিত। না হলে দেখা যায়, সিস্টেম হ্যাং হয়ে আছে - কিছুই হচ্ছে না।  হীপ সাইজ বাড়ানোর জন্য আপনি যে ডিরেক্টরি তে JMeter ডাউনলোড করেছেন, সেই ডিরেক্টরি-র  bin ফোল্ডারের ভেতরে Jmeter.bat (উইন্ডোস মেশিন) বা JMeter ফাইল (লিনাক্স মেশিন) আপডেট করে নিতে পারেন। আমার ক্ষেত্রে আমি ১০GB  হীপ সাইজ করে নিয়েছি এভাবে: set HEAP=-Xms10g -Xmx10g


মনে রাখবেন, হীপ সাইজ বাড়িয়ে JMeter চালু করার জন্য ApacheJMeter.jar ক্লিক করলে কিন্তু এই পরিবর্তন ইফেক্টিভ হবে না, আপনাকে Jmeter.bat (উইন্ডোস মেশিন) বা JMeter (লিনাক্স মেশিন) ফাইলে ডাবল ক্লিক করতে হবে।  



































  • CSV ফাইল থেকে ইউসার ইনফরমেশন পড়ার পদ্ধতি :

বেশিরভাগ ক্ষেত্রেই আমাদের ইউসার ইউনিক হবে।  যেমন, কোনো ওয়েবসাইট-এর  রেজিষ্ট্রশন পেজ লোড টেস্ট করতে গেলে আমাদের ইউনিক ইউসার দরকার হবে।  সেক্ষেত্রে, আমরা একটা CSV  ফাইলে সব ইউসার ইনফরমেশন, যেমন নাম, ফোন নম্বর, ঠিকানা ইত্যাদি রেখে দিব। আর JMeter দিয়ে লোড টেস্ট করার সময় আমরা চাবো যেন ইউসার ইনফরমেশন ওই CSV ফাইল থেকে পড়া হয়।  এটাও খুব সহজে করা যায়। CSV Data Set Config অ্যাড করে নিলেই হলো (Add > Config Element > CSV Data Set Config)



























আমি users.csv ফাইলে হেডার দিয়ে ইনফরমেশন গুলো লিখে রেখেছি:










আর আমার স্ক্রিপ্টে যেই পেজে ঐগুলো ব্যবহার হয়, সেখানে ${variable-name} দিয়ে লিখে দিলেই JMeter বুঝে নেয় যে কোন ভ্যারিয়েবল কে এক্সেস করতে হবে !! নিচের ছবিতে উদাহরণ দিয়ে দিলাম:






























  • রিপোর্টিং:
এই একটা বিষয় নিয়ে লোকজন JMeter -এর উপর নাখোশ।  JMeter অনেকগুলো রিপোর্টিং সুবিধা দিলেও কোনটাই খুব একটা ফ্রেন্ডলি না।  অনেক থার্ড-পার্টি প্লাগ-ইন যদিও আছে, তাও ব্যবহার করা ঝামেলা।  সাধারণত সবাই Summary Report ব্যবহার করে। এটা পেজ রেসপন্স টাইম, এরর রেট, থ্রুপুট ইত্যাদি রিপোর্ট করে।  

কিন্তু রিপোর্টিং-এর আরো ধরণ আছে। লোড টেস্টের মূল উদ্দেশ্য হচ্ছে জানা যে, সিস্টেম কত লোড নিয়ে পারে, ব্রেকিং পয়েন্ট টা কী? কোন কোন পেজই বা বটলনেক তৈরী করছে, ইত্যাদি।  এসব রিয়েল টাইমে JMeter দিয়ে বের করার উপায় নিশ্চই আছে, কিন্তু আমার জানা নেই।  


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


এদের Chrome প্লাগ-ইন দিয়ে আপনি JMeter ইনস্টল করা ছাড়াই কোনো ওয়েবসাইট-এ ইউসার-এর ইন্টারঅ্যাকশন রেকর্ড করতে পারবেন। তারপর সেই স্ক্রিপ্ট ওদের ওয়েবসাইট-এ আপলোড করে লোড টেস্ট করে দেখতে পারবেন। এরা ডেমো দেখানোর জন্য blazedemo.com নামের একটা ডামি ট্রাভেল ওয়েবসাইট বানিয়ে রেখেছে।

সবশেষে বলি, আমি মোটেও JMeter এক্সপার্ট না। উপরের সবগুলো পয়েন্ট-ই সমস্যায় পড়ে ঠেকে শেখা।  আমার লেখায় অনেক ভুল থাকতে পারে। তাই কোনো ভুল পেলে বা আপনার যদি ভালো কোনো রিসোর্স জানা থাকে, তাহলে কমেন্ট-এ দিয়ে দেবেন প্লিজ।


আর আমি একটা গুগল ডকুমেন্ট-এ JMeter -এর উপর ভালো লিংক পেলেই লিখে রাখি। কিছু বিষয় (যেমন, সেসন ডাটা বা কুকি মডিফাই করা, Ajax কল Jmeter function কল দিয়ে রিপ্লেস করা, ডিস্ট্রিবিউটেড লোড টেস্টিং সেটআপ ইত্যাদি) আজকের লেখায় ইচ্ছে করেই লিখলাম না, সেসব বিষয়ের লিংক  ওই গুগল ডক-এ পাবেন।


ধন্যবাদ।
-- ইশতিয়াক


সিস্টেম ডিজাইনের উপর সম্ভাব্য ইন্টারভিউ প্রশ্নের জন্য যেভাবে প্রিপারেশন নিতে পারেন

সিস্টেম ডিজাইনের উপর সম্ভাব্য ইন্টারভিউ প্রশ্নের জন্য যেভাবে প্রিপারেশন নিতে পারেন ১৪ এপ্রিল, শুক্রবার, ২০১৭ সাইফুল ভাই লোকটা খুবই মজার,...