WPR/WPA বাস্তবে — "পুরো PC ধীর"-এর সিস্টেম-ব্যাপী পারফরম্যান্স অনুসন্ধানের ভূমিকা
· Go Komura · Windows, পারফরম্যান্স, WPR, WPA, ETW, পারফরম্যান্স অনুসন্ধান, সমস্যা সমাধান, Windows ডেভেলপমেন্ট
“নতুন অ্যাপ ইনস্টলের পর পুরো PC ধীর হয়ে গেছে বলেছে। কিন্তু Task Manager দেখি CPU ও মেমোরি দুটোতেই জায়গা আছে।” “একটা PC স্টার্ট হতে ৩ মিনিট লাগে। কী ভুল তাই জানি না।” — পারফরম্যান্স পরামর্শ সত্যিই এ আকারে অনেক আসে। যা মিল তা হলো কোনো নির্দিষ্ট প্রক্রিয়া দেখে উত্তর মেলে না।
প্রক্রিয়া-স্তরের টুল আছে। ফাইল ও রেজিস্ট্রি অ্যাক্সেস Process Monitor দিয়ে দেখা যায়, আর .NET অ্যাপের CPU ও GC PerfView দিয়ে ধরা যায়। কিন্তু “পুরো PC ধীর” বা “CPU খালি অথচ ধীর” উপসর্গ শুরু হয় কোন প্রক্রিয়া অপরাধী তা না জেনেই। অ্যাপ A অ্যান্টিভাইরাস স্ক্যানের কারণে ধীর হতে পারে, বা অন্য সার্ভিস ডিস্কে ভারী লিখছে বলে, বা কয়েক প্রক্রিয়া জুড়ে লক শৃঙ্খলের কারণে। যা দরকার তা প্রক্রিয়ার ভিতর নয়, পুরো OS এক টাইমলাইনে রেকর্ড করা ডেটা।
সেটা ধরা ও পড়ার টুল Windows Performance Recorder (WPR) ও Windows Performance Analyzer (WPA)। WPR ETW (Event Tracing for Windows) ভিত্তিতে OS-ব্যাপী কার্যকলাপ রেকর্ড করে, আর WPA সেই রেকর্ডিং গ্রাফ ও টেবিলে বিশ্লেষণ করে। কে কোন স্ট্যাকে CPU ব্যবহার করেছে, থ্রেড কার অপেক্ষা করছিল, কোন প্রক্রিয়া কোন ফাইলে ডিস্ক I/O ইস্যু করেছে — Task Manager-এর এক-দুই স্তর নিচের তথ্য টাইমস্ট্যাম্পসহ থেকে যায়।
ক্ষুদ্র ও মাঝারি ব্যবসার IT কর্মী ও Windows অ্যাপ ডেভেলপারদের লক্ষ্য করে এই নিবন্ধ WPR দিয়ে ক্যাপচারের চর্চা ও WPA পড়ার পদ্ধতি — বিশেষ করে “CPU বেশি” ও “CPU কম অথচ ধীর” অনুসন্ধানের পার্থক্য — ২০২৬ সালের আগস্টের প্রাথমিক উৎস থেকে সাজায়।
১. আগে উপসংহার
- “পুরো PC ধীর” অনুসন্ধানের প্রথম পছন্দ WPR/WPA, যা OS-ব্যাপী ETW ট্রেস ধরে পড়ে। প্রক্রিয়া-স্তরের টুল (Task Manager, Procmon, PerfView) যা আটকাতে পারে না, সব প্রক্রিয়া ও কার্নেল এক টাইমলাইনে দেখলে ধরা যায়।12
- ক্যাপচার টুল wpr.exe Windows 8.1 ও পরবর্তীতে সাথে আসে। অতিরিক্ত ইনস্টল ছাড়াই ব্যবহার করা যায়। GUI সংস্করণ (WPRUI) ও বিশ্লেষণ টুল WPA Windows ADK-তে অন্তর্ভুক্ত।12
- মৌলিক পদ্ধতি তিন লাইন। অ্যাডমিনিস্ট্রেটর হিসেবে
wpr -start GeneralProfile -filemode→ সমস্যা পুনরুৎপাদন →wpr -stop C:\temp\trace.etl। এতটা মনে রাখলে ক্যাপচার শুরু করা যায়।3 - মাঠের ভিত্তি “গ্রাহক পরিবেশে শুধু wpr.exe দিয়ে ক্যাপচার; পড়া নিজের মেশিনে WPA” ভাগ। সফটওয়্যার ইনস্টল করা যায় না এমন সার্ভারেও ক্যাপচার করা যায়। প্যাকেট ক্যাপচারের “মানক টুল দিয়ে ধরা, Wireshark-এ পড়া”-র মতোই ধারণা।1
- WPA পড়া “CPU, অপেক্ষা, না I/O” শ্রেণিবিভাগ দিয়ে শুরু হয়। CPU জ্বললে CPU Usage (Sampled); CPU খালি অথচ ধীর হলে CPU Usage (Precise)-এ অপেক্ষা বিশ্লেষণ; ডিস্ক সন্দেহ হলে Disk Usage — পথ শুরুতেই ভাগে।45
- CPU Usage (Sampled) প্রায় প্রতি ১ মিলিসেকেন্ড স্যাম্পলিং থেকে দেখায় “কোন ফাংশন CPU ব্যবহার করেছে”। Task Manager-এর “৫০%”-এর ভাঙন প্রক্রিয়া → থ্রেড → স্ট্যাক → ফাংশন চলা যায়।6
- CPU Usage (Precise) কনটেক্সট সুইচের সম্পূর্ণ রেকর্ড, আর বলে “থ্রেড কার অপেক্ষা করছিল”। Waits (অপেক্ষার সময়), ReadyingProcess (কে জাগিয়েছে), ও ReadyThreadStack (জাগানোর স্ট্যাক) চলা এই নিবন্ধ সবচেয়ে পৌঁছাতে চায় সেই কৌশল।47
- স্ট্যাক পড়তে সিম্বল কনফিগারেশন লাগে। WPA ডিফল্টে Microsoft-এর পাবলিক সিম্বল সার্ভার দেখে। নিজের অ্যাপের ফাংশন নাম দেখতে নিজের PDB-এর পথ যোগ করুন।8
- ETL ফাইলে প্রক্রিয়ার নাম ও ফাইল পথের মতো অভ্যন্তরীণ সিস্টেম তথ্য থাকে। ক্যাপচার ন্যূনতম প্রয়োজন রাখুন, আর কোম্পানি ছেড়ে গেলে কীভাবে সামলানো হবে ক্যাপচারের আগে স্থির করুন।
২. টুল কোথায় বসে — WPR ধরে, WPA পড়ে
Windows Performance Toolkit (WPT) Windows ADK (Windows Assessment and Deployment Kit)-এ অন্তর্ভুক্ত পারফরম্যান্স-অনুসন্ধান টুলসেট; কেন্দ্র WPR ও WPA জোড়া।2 ভূমিকা স্পষ্ট ভাগ।
- WPR (Windows Performance Recorder) = ক্যাপচার। এটি ETW প্রোভাইডার দলকে “প্রোফাইল” নামক এককে বাঁধে, রেকর্ডিং শুরু ও থামায়, আর ETL ফাইল তৈরি করে। কমান্ড-লাইন সংস্করণ wpr.exe Windows 8.1 ও পরবর্তীতে সাথে আসে, অতিরিক্ত ইনস্টল ছাড়া। GUI সংস্করণ (WPRUI.exe) ADK-তে অন্তর্ভুক্ত।1
- WPA (Windows Performance Analyzer) = বিশ্লেষণ। এটি ETL ফাইল খুলে গ্রাফ ও টেবিলে বিশ্লেষণ করে। ADK ইনস্টল লাগে।2
অন্য কথায়, গ্রাহক পরিবেশে রাখার কিছু নেই। OS-মানক wpr.exe দিয়ে ক্যাপচার করুন, ETL ফাইল বাড়ি নিয়ে যান, আর নিজের PC-তে WPA-তে পড়ুন — প্যাকেট ক্যাপচার-এর “pktmon দিয়ে ধরা, Wireshark-এ পড়া” ভাগই টেকে।
flowchart TB
accTitle: WPR দিয়ে ক্যাপচার ও WPA দিয়ে পড়ার ভাগ
accDescr: গ্রাহক পরিবেশে OS-মানক wpr.exe দিয়ে রেকর্ড করে ETL ফাইল তৈরি করুন; বাড়ি নিয়ে নিজের PC-তে ADK দিয়ে ইনস্টল WPA-তে বিশ্লেষণ করুন
subgraph customer["গ্রাহক PC(অতিরিক্ত ইনস্টল নেই)"]
wpr["wpr start → পুনরুৎপাদন → stop"] --> etl["ETL ফাইল"]
end
subgraph office["আপনার PC(ADK দিয়ে WPA)"]
wpa["গ্রাফ ও টেবিল বিশ্লেষণ"]
end
etl -->|"বাড়ি নিয়ে যান"| wpa
চিত্র 1: গ্রাহক পরিবেশে OS-মানক wpr.exe দিয়ে রেকর্ড করে ETL ফাইল তৈরি করুন; বাড়ি নিয়ে নিজের PC-তে ADK দিয়ে ইনস্টল WPA-তে বিশ্লেষণ করুন।
সদৃশ টুল থেকে পার্থক্যও আগে সাজানো দরকার।
| Process Monitor | PerfView | WPR + WPA | |
|---|---|---|---|
| যে প্রশ্নের উত্তর দেয় | কোন প্রক্রিয়া কোন পথে কী করেছে, আর কী হয়েছে | .NET অ্যাপের CPU, GC ও অ্যালোকেশন কেমন | পুরো OS জুড়ে সময় কোথায় হারিয়েছে |
| পরিধি | ফাইল, রেজিস্ট্রি ও প্রক্রিয়া স্টার্টের অপারেশন লগ | আগে managed কোড | সিস্টেম-ব্যাপী CPU, অপেক্ষা, ডিস্ক, ফাইল I/O, পাওয়ার ইত্যাদি |
| উপযোগী উপসর্গ | সেটিং পড়া হচ্ছে না, ACCESS DENIED | শুধু নিজের .NET অ্যাপের ধীরতা বা মেমোরি | পুরো PC ধীর, CPU খালি অথচ ধীর, অপরাধী প্রক্রিয়া অজানা |
| নিবন্ধ | Procmon-এর ব্যবহারিক নির্দেশিকা | PerfView-এর ব্যবহারিক ভূমিকা | এই নিবন্ধ |
Procmon যদি “সে কী করেছে” অপারেশন লগ হয় আর PerfView “.NET-এর ভিতরে কী হয়েছে”, WPA সেই টুল যা প্রতিটি প্রক্রিয়া জুড়ে “সময় কোথায় হারিয়েছে” অডিট করে। ETW-এর যন্ত্রপাতি নিজে, আর নিজের অ্যাপে ETW দিয়ে ইনস্ট্রুমেন্ট কীভাবে, “Windows Event Log ও ETW-এর ভূমিকা“-এ আছে। নিজের অ্যাপ ETW ইভেন্ট ছাড়লে অ্যাপের চেকপয়েন্ট একই ট্রেসে রেকর্ড হয় আর সেগুলো সারি করা সহজ হয়। তবে WPR শুধু আপনার বেছে নেওয়া রেকর্ডিং প্রোফাইল যে প্রোভাইডার চালু করেছে তাদের ইভেন্ট রেকর্ড করে। GeneralProfile নিজের প্রোভাইডার অন্তর্ভুক্ত করে না, তাই মেশাতে চাইলে নিজের প্রোভাইডার চালু করা কাস্টম রেকর্ডিং প্রোফাইল (.wprp) তৈরি করুন আর wpr -start GeneralProfile -start MyApp.wprp!MyAppProfile হিসেবে জোড়ুন, .wprp ফাইলের ভিতর প্রোফাইল নাম ! দিয়ে নির্দিষ্ট করে।3
৩. বাস্তবে ক্যাপচার (WPR) — start, পুনরুৎপাদন, stop
অ্যাডমিনিস্ট্রেটর টার্মিনালে মৌলিক পদ্ধতি।
:: List of built-in profiles you can use
wpr -profiles
:: 1. Start capture (general-purpose profile, file mode)
wpr -start GeneralProfile -filemode
:: 2. Reproduce the issue (check capture status with wpr -status)
:: 3. Stop and save (you can attach a description of the problem).
:: Create the destination folder in advance (without it, -stop fails to save)
mkdir C:\temp 2>nul
wpr -stop C:\temp\slow-pc.etl "Reproduced the issue where the whole PC becomes slow while starting App X"
:: To abandon without saving
wpr -cancel
-start-এ যা দেন তা প্রোফাইল, অনুসন্ধানের দরকারি ETW প্রোভাইডারের গোছা।3 ঘন ব্যবহারগুলো মনে রাখাই যথেষ্ট।9
| প্রোফাইল | যা রেকর্ড করে | কখন ব্যবহার করবেন |
|---|---|---|
GeneralProfile |
CPU স্যাম্পল, কনটেক্সট সুইচ ও ডিস্ক I/Oসহ সাধারণ সেট | এখান থেকে শুরু। কী ভুল জানা নেই তখন প্রথম পদক্ষেপ |
CPU |
বিস্তারিত CPU ব্যবহার | আগেই জানা CPU জ্বলছে |
DiskIO |
ডিস্ক I/O কার্যকলাপ | ডিস্ক সন্দেহ |
FileIO |
ফাইল I/O কার্যকলাপ | কোন ফাইল অ্যাক্সেস হচ্ছে তা ধরতে চাইলে |
একাধিক প্রোফাইল একসাথে -start সারি করে নির্দিষ্ট করা যায় (যেমন wpr -start GeneralProfile -start FileIO -filemode)।3
flowchart TB
accTitle: WPR ক্যাপচার প্রবাহ ও মোড কীভাবে বাছবেন
accDescr: জায়গাতেই পুনরুৎপাদনযোগ্য সমস্যা ফাইল মোডে ছোট নির্ভরযোগ্য ক্যাপচার হয়; সময় জানা নেই এমন সমস্যা ডিফল্ট মেমোরি-মোড রিং বাফারে অপেক্ষা করা হয়। বুট বা লগঅনের সমস্যা বুট ট্রেস ব্যবহার করে। প্রতি ক্ষেত্রে start / পুনরুৎপাদন / stop পদ্ধতি একই
q{"কখন ঘটে"}
q -->|"জায়গাতেই"| file["ফাইল মোড: ছোট ক্যাপচার"]
q -->|"সময় অজানা"| mem["মেমোরি মোড: অপেক্ষা(৩.১)"]
q -->|"বুট বা লগঅন"| boot["বুট ট্রেস(অধ্যায় ৮)"]
file --> s1["start → পুনরুৎপাদন → stop"]
mem --> s1
চিত্র 2: জায়গাতেই পুনরুৎপাদনযোগ্য সমস্যা ফাইল মোডে ছোট নির্ভরযোগ্য ক্যাপচার হয়; সময় জানা নেই এমন সমস্যা ডিফল্ট মেমোরি-মোড রিং বাফারে অপেক্ষা করা হয়। বুট বা লগঅনের সমস্যা বুট ট্রেস ব্যবহার করে। প্রতি ক্ষেত্রে start / পুনরুৎপাদন / stop পদ্ধতি একই।
৩.১. Memory মোড ও File মোড — পুনরুৎপাদন করতে পারবেন, নাকি অপেক্ষা করবেন
WPR-এর দুই রেকর্ডিং-গন্তব্য মোড; ডিফল্ট Memory মোড (ইন-মেমোরি বৃত্তাকার বাফার)। এটি রিং বাফার যা সবচেয়ে পুরনো ইভেন্ট থেকে ওভাররাইট করে, তাই সময় জানা নেই এমন সমস্যার অপেক্ষা করে ক্যাপচার চালিয়ে রাখা, আর ঘটলে থামানো-র জন্য উপযোগী। -filemode যোগ করলে File মোড-এ স্যুইচ হয়, আর সবকিছু অবিচ্ছিন্ন ফাইলে রেকর্ড হয়। এটি ওভাররাইট হয় না; একমাত্র ছাদ খালি ডিস্ক স্থান, আর ফাইল সীমাহীন বাড়ে।10
flowchart TB
accTitle: Memory মোড ও File মোড কীভাবে রেকর্ড করে
accDescr: Memory মোড ইন-মেমোরি বৃত্তাকার বাফারে রেকর্ড করে; পুরনো ইভেন্ট ওভাররাইট হয় আর শুধু সাম্প্রতিক থাকে, তাই অপেক্ষার জন্য উপযোগী। File মোড সবকিছু ফাইলে রাখে, কিন্তু একমাত্র ছাদ খালি ডিস্ক স্থান, তাই ছোট নির্ভরযোগ্য পুনরুৎপাদনের জন্য উপযোগী
ev["ETW ইভেন্ট"] --> ring["Memory মোড: রিং বাফার"]
ev --> filem["File মোড: ফাইল বাড়ান"]
ring -.-> use1["অজানা সময়ের অপেক্ষা"]
filem -.-> use2["ছোট নির্ভরযোগ্য পুনরুৎপাদন"]
চিত্র 3: Memory মোড ইন-মেমোরি বৃত্তাকার বাফারে রেকর্ড করে; পুরনো ইভেন্ট ওভাররাইট হয় আর শুধু সাম্প্রতিক থাকে, তাই অপেক্ষার জন্য উপযোগী। File মোড সবকিছু ফাইলে রাখে, কিন্তু একমাত্র ছাদ খালি ডিস্ক স্থান, তাই ছোট নির্ভরযোগ্য পুনরুৎপাদনের জন্য উপযোগী।
বাছার নিয়ম এই রকম।
- জায়গাতেই পুনরুৎপাদনযোগ্য → File মোড। পুনরুৎপাদনের ঠিক আগে শুরু, ঠিক পরে থামান, আর ক্যাপচার কয়েক মিনিটের মধ্যে রাখুন
- সময় অজানা → Memory মোডে (ডিফল্ট) অপেক্ষা করুন। ঘটলেই
wpr -stop - কয়েক মিনিটের GeneralProfileও শত শত MB থেকে GB শ্রেণির ETL তৈরি করতে পারে। খুব বড় ফাইল WPA-তে বিশ্লেষণ-অযোগ্য হতে পারে, তাই “যত দীর্ঘ ক্যাপচার তত ভালো” উল্টো ফল দেয়।1011
GUI থেকে ক্যাপচার করতে WPRUI শুরু করুন, প্রোফাইল ও Logging mode বেছে নিন, আর Start/Save করুন। সরকারি How-to পদ্ধতি সংক্ষেপ করে।11 গ্রাহক-সাইটের যোগাযোগকে ক্যাপচার করতে বললে উপরের তিন কমান্ড পদ্ধতিতে যেমন আছে তেমনই যেতে পারে।
৪. WPA পড়ার মৌলিক কথা — গ্রাফ, টেবিলের সোনালি নিয়ম, ও সময় সঙ্কুচিত করা
ক্যাপচার করা ETL WPA-তে খুললে বাঁদিকের Graph Explorer System Activity, Computation, Storage ও Memory-এর মতো শ্রেণিতে গ্রাফ থাম্বনেইল তালিকা করে।12 যে গ্রাফ দেখতে চান ডানদিকের Analysis ট্যাবে টেনে আনুন, উপরে গ্রাফ আর নিচে টেবিল আসে। প্রথম তিন বিষয় এগুলো।
- টেবিলের সোনালি নিয়ম — কলামের ক্রম গ্রুপিং স্থির করে। WPA টেবিলে দুই উল্লম্ব বার আছে, সোনা ও নীল, আর সোনার বারের বাঁদিকের কলাম সেই ক্রমে ডেটা স্তরায়িত (গ্রুপ) করে, আর নীল বারের ডানদিকের কলাম যোগফল।13 Process → Stack সাজালে প্রতি-প্রক্রিয়া স্ট্যাক যোগ পাবেন; Stack → Process সাজালে একই স্ট্যাক ব্যবহার করা প্রতিটি প্রক্রিয়ার যোগ — কলাম টেনে ক্রম বদলানো নিজেই বিশ্লেষণ কাজ। এই একটা পয়েন্ট বুঝলে প্রতিটি WPA টেবিল একইভাবে পড়া যায়।
flowchart TB
accTitle: টেবিলের সোনালি নিয়ম — দুই বার ও কলামের ভূমিকা
accDescr: সোনার বারের বাঁদিকের কলাম সেই ক্রমে ডেটা স্তরায়িত করে; সোনা ও নীল বারের মাঝে প্রদর্শন কলাম; নীল বারের ডানদিকের কলাম যোগফল। কলাম টেনে ক্রম বদলানো নিজেই বিশ্লেষণ কাজ
left["সোনার বাঁয়ে: গ্রুপিং"] --> gold["সোনার বার"]
gold --> mid["বারগুলোর মাঝে: প্রদর্শন"]
mid --> blue["নীল বার"]
blue --> right["নীলের ডানে: যোগফল"]
left -.-> op["বিশ্লেষণে কলাম টানুন"]
চিত্র 4: সোনার বারের বাঁদিকের কলাম সেই ক্রমে ডেটা স্তরায়িত করে; সোনা ও নীল বারের মাঝে প্রদর্শন কলাম; নীল বারের ডানদিকের কলাম যোগফল। কলাম টেনে ক্রম বদলানো নিজেই বিশ্লেষণ কাজ।
- সময়সীমা সঙ্কুচিত করুন। গ্রাফে টেনে সীমা বেছে নিন, তারপর ডান-ক্লিক ও “Zoom”, আর যোগফল শুধু সেই অন্তরালে স্যুইচ হয়। পারফরম্যান্স অনুসন্ধান নীতিতে সবসময় শুধু “যে অন্তরালে সমস্যা হচ্ছিল” দেখে (অধ্যায় ৯)।
- সিম্বল কনফিগার করুন। স্ট্যাক ফাংশন নামে পড়তে মেনু থেকে Trace > Load Symbols চালান।14 ডিফল্টে Microsoft-এর পাবলিক সিম্বল সার্ভার (msdl.microsoft.com) দেখে, তাই ইন্টারনেট থাকলে Windows-এর নিজের স্ট্যাক সমাধান হয়। নিজের অ্যাপের ফাংশন নাম দেখতে Trace > Configure Symbol Paths-এ অ্যাপের PDB ফোল্ডার যোগ করুন।8 PDB কী, আর Release বিল্ডের জন্যও কেন সবসময় রাখবেন, “PDB (Program Database) কী“-এ সংক্ষেপ। .NET Framework NGen নেটিভ ইমেজের জন্য WPR ক্যাপচার সময়ে NGen PDB (.ngenpdb) তৈরি করে ট্রেসের পাশের ফোল্ডারে রাখে, আর WPA স্বয়ংক্রিয়ভাবে দেখে।8 এটি শুধু NGen ইমেজের যন্ত্র, আর আপনার সাধারণ JIT .NET অ্যাপ কোড পরিধির বাইরে। JIT-কোড ঠিকানা থেকে ফাংশন নামের ম্যাপিং CLR যে JIT ইভেন্ট ছাড়ে তা থেকে সমাধান হয়, তাই .NET অ্যাপ অনুসন্ধানে CLR প্রোভাইডার (Microsoft-Windows-DotNETRuntime ও মিল রানডাউন) চালু করা রেকর্ডিং প্রোফাইল (.wprp) তৈরি করুন আর অধ্যায় ৩-এর নিজের প্রোভাইডারের মতো জোড়ুন,
wpr -start GeneralProfile -start MyDotNet.wprp!profile-name, যাতে CLR ইভেন্ট ট্রেসে থাকে (স্থানীয় WPR কোন বিল্ট-ইন প্রোফাইল দেয়wpr -profilesদিয়ে দেখুন)। তার উপর সোর্স লাইনে ম্যাপিংয়ের জন্য বিল্ড তৈরি PDB রাখুন, আর উপরের সিম্বল পথে যোগ করুন।
flowchart TB
accTitle: স্ট্যাক ফাংশন নামে পড়তে সিম্বল সমাধান
accDescr: Trace Load Symbols চালালে Windows নিজে Microsoft-এর পাবলিক সিম্বল সার্ভার থেকে সমাধান হয়, আর নিজের অ্যাপ সিম্বল পথে যোগ করা বিল্ড PDB থেকে। NGen ইমেজ WPR তৈরি NGen PDB ব্যবহার করে; JIT .NET কোড ট্রেসের CLR JIT ইভেন্ট প্লাস বিল্ড PDB থেকে সমাধান হয়
load["Trace > Load Symbols"] --> ms["Windows: পাবলিক সিম্বল"]
load --> own["নিজের অ্যাপ: বিল্ড PDB"]
ms -.-> ngen["NGen: WPR .ngenpdb"]
own -.-> jit["JIT: CLR ইভেন্ট + PDB"]
চিত্র 5: Trace Load Symbols চালালে Windows নিজে Microsoft-এর পাবলিক সিম্বল সার্ভার থেকে সমাধান হয়, আর নিজের অ্যাপ সিম্বল পথে যোগ করা বিল্ড PDB থেকে। NGen ইমেজ WPR তৈরি NGen PDB ব্যবহার করে; JIT .NET কোড ট্রেসের CLR JIT ইভেন্ট প্লাস বিল্ড PDB থেকে সমাধান হয়।
প্রস্তুত হলে পরের শাখা থেকে ঢোকেন। সেই অন্তরালে CPU বেশি ছিল, না কম? বেশি হলে অধ্যায় ৫ (Sampled); কম অথচ ধীর হলে অধ্যায় ৬ (Precise)।
flowchart TB
accTitle: উপসর্গ থেকে WPA গ্রাফ বাছার শাখা
accDescr: সমস্যার অন্তরালে জুম করুন; CPU বেশি হলে CPU Usage Sampled-এ যান; কম অথচ ধীর হলে একক-কোর / একক-থ্রেড পিন দেখে তারপর CPU Usage Precise-এ অপেক্ষা বিশ্লেষণ; ডিস্ক সন্দেহ হলে Disk Usage ও File IO
zoom["সমস্যার অন্তরালে জুম"] --> cpu{"সেই অন্তরালে CPU"}
cpu -->|"বেশি"| sampled["অধ্যায় ৫: Sampled"]
cpu -->|"কম, তবু ধীর"| core{"১-কোর / ১-থ্রেড পিন"}
core -->|"হ্যাঁ"| sampled
core -->|"না"| precise["অধ্যায় ৬: Precise"]
cpu -->|"ডিস্ক সন্দেহ"| disk["অধ্যায় ৭: ডিস্ক / ফাইল I/O"]
চিত্র 6: সমস্যার অন্তরালে জুম করুন; CPU বেশি হলে CPU Usage Sampled-এ যান; কম অথচ ধীর হলে একক-কোর / একক-থ্রেড পিন দেখে তারপর CPU Usage Precise-এ অপেক্ষা বিশ্লেষণ; ডিস্ক সন্দেহ হলে Disk Usage ও File IO।
৫. CPU বেশি হলে — CPU Usage (Sampled) দিয়ে “কোন ফাংশন জ্বলছে”
CPU পিন থাকলে যা দেখেন তা CPU Usage (Sampled)। এটি স্যাম্পলিং ডেটা যা প্রায় প্রতি ১ মিলিসেকেন্ড প্রতিটি CPU-তে রেকর্ড করেছে “এখন কোন প্রক্রিয়ার কোন স্ট্যাক চলছে”, আর স্যাম্পল সংখ্যার অনুপাত CPU সময়ের ভাঙন যেমন আছে তেমন।6
flowchart TB
accTitle: CPU Usage Sampled কীভাবে কাজ করে
accDescr: প্রায় প্রতি ১ মিলিসেকেন্ড প্রতিটি CPU-তে চলমান স্ট্যাক রেকর্ড হয়, আর যোগ করা স্যাম্পল অনুপাত CPU সময়ের ভাঙন। প্রক্রিয়া থেকে থ্রেড, স্ট্যাক ও ফাংশন পড়ুন। স্যাম্পলের মাঝে শেষ হওয়া ছোট কার্যকলাপ দেখা যায় না
tick["প্রায় প্রতি ১ ms বিঘ্ন"] --> snap["চলমান স্ট্যাক রেকর্ড"]
snap --> agg["স্যাম্পল অনুপাত = CPU ভাঙন"]
agg --> drill["প্রক্রিয়া → থ্রেড → স্ট্যাক"]
snap -.-> miss["স্যাম্পলের মাঝের কার্যকলাপ মিস"]
চিত্র 7: প্রায় প্রতি ১ মিলিসেকেন্ড প্রতিটি CPU-তে চলমান স্ট্যাক রেকর্ড হয়, আর যোগ করা স্যাম্পল অনুপাত CPU সময়ের ভাঙন। প্রক্রিয়া থেকে থ্রেড, স্ট্যাক ও ফাংশন পড়ুন। স্যাম্পলের মাঝে শেষ হওয়া ছোট কার্যকলাপ দেখা যায় না।
- Graph Explorer-এর Computation থেকে CPU Usage (Sampled) Analysis ট্যাবে রাখুন আর Utilization by Process, Stack প্রিসেট বেছে নিন।5
- Weight (বা Count) অবতরণ ক্রমে প্রক্রিয়া দেখুন। Task Manager-এ যে “৫০%” ছিল তার পরিচয় আগে প্রক্রিয়া স্তরে স্পষ্ট হয়।
- অপরাধী প্রক্রিয়ার Stack কলাম প্রসারিত করুন। স্ট্যাক গাছ হিসেবে যোগ হয়, আর যে পথে শাখায় সংখ্যা খুব কমে না সেই পথ চলা আপনাকে CPU জ্বালানো ফাংশনে নামিয়ে দেয়। সিম্বল সমাধান হলে নিজের কোডের কোন ফাংশন পর্যন্ত সোজা রেখা।
- গাছ প্রসারণ ক্লান্তিকর হলে গ্রাফ প্রদর্শন Flame-এ স্যুইচ করুন। প্রস্থ = CPU সময়ের ভাগ দিয়ে আঁকা, তাই কোন কল পথ আধিপত্য এক নজরে স্পষ্ট। CPU Usage (Sampled)-এ Flame by Process, Stack প্রিসেটও আছে।13
এক সতর্কতা। স্যাম্পলিং বলে স্যাম্পলের মাঝে শেষ হওয়া ছোট কার্যকলাপ দেখা যায় না।6 একে “মোটের উপর CPU কোথায় ব্যবহৃত হয়েছে” দেখার টুল মনে রাখুন, প্রতি-আহ্বান স্থায়িত্ব মাপার টুল নয়।
৬. CPU কম অথচ ধীর — CPU Usage (Precise) ও অপেক্ষা বিশ্লেষণ
এই নিবন্ধের কেন্দ্র। অপেক্ষা বিশ্লেষণে যাওয়ার আগে একটা কথা নিশ্চিত করুন। “মোট CPU ব্যবহার কম” মানে “CPU বাধা নয়” নয়। ১৬-কোর PC-তে এক কোরে পিন ক্রমিক কাজ (এক UI থ্রেড পুরো দৌড়াচ্ছে) মোটে প্রায় ৬% দেখায়। আগে অধ্যায় ৫-এর Sampled (বা CPU Usage (Precise)-এর Utilization by CPU) দেখে নির্দিষ্ট কোর বা থ্রেডে পিন নেই কিনা, আর না থাকলে এই অধ্যায়ে আসুন — কাজ চলতে পারছে না নয়, সে অপেক্ষা করছে। কী অপেক্ষা বলছে তা CPU Usage (Precise)।
যেখানে Sampled স্যাম্পলিং, Precise কনটেক্সট সুইচের (থ্রেড সুইচ) সম্পূর্ণ রেকর্ড। থ্রেড অপেক্ষায় যায়, কেউ জাগায় (Ready), আর CPU-তে নামে — সেই রাউন্ড ট্রিপ এক সারিতে থাকে, আর নিচের কলাম পড়া যায়।74
| কলাম | অর্থ |
|---|---|
| NewThreadStack | কোন স্ট্যাকে সেই থ্রেড অপেক্ষায় ঢুকেছে (= থামার সময় কী করছিল) |
| Waits (us) | কতক্ষণ অপেক্ষা করেছে |
| Ready (us) | জাগানো থেকে CPU-তে নামা পর্যন্ত কতক্ষণ অপেক্ষা করানো হয়েছে (CPU বিরোধ) |
| ReadyingProcess / ReadyingThreadId | যে প্রক্রিয়া ও থ্রেড সেই থ্রেডকে জাগিয়েছে (অপেক্ষা ছেড়েছে) |
| ReadyThreadStack | কোন স্ট্যাকে জাগানোর পক্ষ জাগিয়েছে |
flowchart TB
accTitle: এক অপেক্ষা রাউন্ড ট্রিপ ও কলামের মিল
accDescr: থ্রেড NewThreadStack-এ থাকা স্ট্যাকে অপেক্ষায় ঢোকে, আর Waits সময় অপেক্ষা করে। কেউ জাগালে সেই পক্ষ ReadyingProcess ও ReadyThreadStack-এ থাকে; CPU বিরোধের জন্য Ready সময় অপেক্ষা করে আবার চলে
run1["চলছে"] -->|"অপেক্ষায় ঢোকে"| waitst["অপেক্ষা(Waits us)"]
waitst -->|"কেউ জাগায়"| ready["Ready(CPU বিরোধ)"]
ready -->|"CPU-তে নামে"| run2["আবার চলছে"]
waitst -.-> col["NewThreadStack / ReadyingProcess"]
চিত্র 8: থ্রেড NewThreadStack-এ থাকা স্ট্যাকে অপেক্ষায় ঢোকে, আর Waits সময় অপেক্ষা করে। কেউ জাগালে সেই পক্ষ ReadyingProcess ও ReadyThreadStack-এ থাকে; CPU বিরোধের জন্য Ready সময় অপেক্ষা করে আবার চলে।
পড়ার আকৃতি এই রকম।4
- Utilization by Process, Thread প্রিসেট লাগান আর কলামে NewThreadStack ও ReadyThreadStack যোগ করুন।
- আগে যে থ্রেড বিলম্বিত অপারেশন চালাচ্ছিল চিনুন (UI থ্রেড, সংশ্লিষ্ট অনুরোধ সামলানো থ্রেড)। মোট Waits-এর অবতরণ ক্রমে শুধু দেখা বিভ্রান্ত করে, কারণ “ইচ্ছে করে সারা সময় অপেক্ষা” করা থ্রেড, যেমন মেসেজ পাম্প বা টাইমার, শীর্ষে থাকে। লক্ষ্য থ্রেড পেলে তার CPU Usage (ms) বড় হলে অধ্যায় ৫-এর CPU সমস্যা; Waits আধিপত্য করলে অপেক্ষা সমস্যা।
- NewThreadStack প্রসারিত করে দেখুন থামার সময় কী করছিল।
WaitForSingleObjectবাEnterCriticalSectionলক অপেক্ষা;ReadFile-এর মতো সিঙ্ক্রোনাস I/O-এর ভিতরে I/O অপেক্ষা; সকেট রিসিভের ভিতরে পক্ষের জবাবের অপেক্ষা। - তারপর দেখুন কে অপেক্ষা ছেড়েছে। ReadyThreadStack প্রসারিত করে ReadyingProcess / ReadyingThreadId দেখুন। কার্নেলের
KiTimerExpirationথেকে জাগালে টাইমার ছিল (= টাইমআউট পর্যন্ত ঘুমিয়েছে); I/O সম্পূর্ণতা সামলানো থেকে জাগালে তা I/O অপেক্ষা নিশ্চিত করে।4 - জাগানোর পক্ষ অন্য থ্রেড বা অন্য প্রক্রিয়া হলে একই পদ্ধতিতে সেই থ্রেড অনুসন্ধান করুন। “A লক ছাড়ার জন্য B-এর অপেক্ষা করছিল, B C-এর RPC জবাবের, C ডিস্ক I/O-এর” — এই শৃঙ্খল মূল পর্যন্ত চললে যা পাবেন তা বিলম্বের ক্রিটিক্যাল পাথ।7
flowchart TB
accTitle: অপেক্ষা বিশ্লেষণে চলা ক্রিটিক্যাল-পাথ শৃঙ্খল
accDescr: বিলম্বিত থ্রেড A-এর NewThreadStack-এ দেখুন থামার সময় কী করছিল, ReadyThreadStack ও ReadyingProcess থেকে জাগানোর B চিনুন, আর B-কে একই পদ্ধতিতে মূল ডিস্ক I/O পর্যন্ত অনুসন্ধান করুন
a["থ্রেড A(বিলম্বিত কাজ)"] -->|"লক অপেক্ষা"| b["থ্রেড B(লক ধরে)"]
b -->|"RPC অপেক্ষা"| c["প্রক্রিয়া C"]
c -->|"সিঙ্ক I/O অপেক্ষা"| d["ডিস্ক I/O(মূল)"]
d -.->|"সম্পূর্ণতা C জাগায়"| c
c -.->|"জবাব B জাগায়"| b
b -.->|"লক ছাড়া A জাগায়"| a
চিত্র 9: বিলম্বিত থ্রেড A-এর NewThreadStack-এ দেখুন থামার সময় কী করছিল, ReadyThreadStack ও ReadyingProcess থেকে জাগানোর B চিনুন, আর B-কে একই পদ্ধতিতে মূল ডিস্ক I/O পর্যন্ত অনুসন্ধান করুন।
“মাল্টিথ্রেড করলাম আর দ্রুত হয়নি” ধরনের ক্ষেত্রে এই পদ্ধতি প্রতিটি ওয়ার্কার এক লকে সারিবদ্ধ যেমন আছে তেমন দেখায়। ডিজাইন দিয়ে লক বিরোধ এড়ানো “ব্যবহারিক মাল্টিথ্রেডিং সেরা চর্চা: .NET সংস্করণ“-এ আছে, আর সিঙ্ক্রোনাস I/O-তে অপেক্ষা না করে সম্পূর্ণতা নোটিফিকেশনে চলা Windows যন্ত্র “I/O Completion Ports (IOCP) ও .NET Thread Pool“-এ আছে। WPA-তে “কার অপেক্ষা করছিল” পিন করে সেই ডিজাইন যুক্তি দিয়ে ঠিক করা এক অবিচ্ছিন্ন প্রবাহ।
৭. ডিস্ক ও ফাইল I/O — “কেউ ডিস্ক স্ক্যান করছে” চেনা
“পুরো PC ধীর”-এর ক্লাসিক অপরাধী CPU নয়, ডিস্ক। Storage শ্রেণির Disk Usage ও File I/O দিয়ে অনুসন্ধান করেন।15
Disk Usage ডিস্ক I/O-এর রেকর্ড, আর দুই কলাম গুরুত্বপূর্ণ। Disk Service Time সেই সময় যা ডিস্ক ডিভাইস সত্যিই সেই I/O প্রক্রিয়া করতে লেগেছে; IO Time I/O OS কিউতে ঢোকা থেকে সম্পূর্ণ হওয়া পর্যন্ত সময়। IO Time সবসময় অন্তত Service Time কিউয়ের পরিমাণে, তাই IO Time Service Time-এর চেয়ে অনেক লম্বা হলে সেই I/O “কিউতে অপেক্ষা” করছিল।6 তবে এতটুকুতেই স্থির হয় না কিউ তৈরির অপরাধী অন্য প্রক্রিয়া, নাকি শুধু সেই প্রক্রিয়ার নিজের ভারী I/O ধীর ডিভাইসে সারিবদ্ধ। এখানে সিদ্ধান্ত টানবেন না; Service Time (ডিভাইসের নিজের সাড়া) ও পরের প্রক্রিয়া, পথ, স্ট্যাক ভাঙন দিয়ে মীমাংসা করুন।
তারপর Utilization by Process, Path Name, Stack প্রিসেট দিয়ে দেখুন কোন প্রক্রিয়া কোন ফাইলে কোন স্ট্যাক থেকে I/O ইস্যু করেছে, IO Time বা Size-এর অবতরণ ক্রমে।15 মাঠে ঘন উঠে আসা উত্তর দুটো।
- অ্যান্টিভাইরাস প্রতিটি ফাইল স্ক্যান করছিল। অ্যাপ স্টার্ট হতে ধীর সেই জানালায় অ্যান্টিভাইরাস প্রক্রিয়া বিপুল রিড ইস্যু করতে দেখা যায়। প্রক্রিয়ার নাম, পথ ও পরিমাণ বাদ দেওয়ার আলোচনার প্রমাণ যেমন আছে তেমন।
- অন্য প্রক্রিয়া ভারী লিখছিল। ব্যাকআপ, ইনডেক্সার, অতিরিক্ত লেখা লগ ইত্যাদি। লেখা ডিস্কে কখন পৌঁছায় তাতে ক্যাশ ম্যানেজার জড়িত, তাই “যে মুহূর্তে লিখেছেন” আর “যে মুহূর্তে ডিস্ক ব্যস্ত” আলাদা হতে পারে — “Cache Manager — আপনার WriteFile সত্যিই ডিস্কে কখন পৌঁছায়“-এও আছে।
File I/O এক স্তর উপরে, অ্যাপ ইস্যু করা ফাইল অপারেশনের (Create/Read/Write ইত্যাদি) রেকর্ড, আর Duration by Process, Thread, Type-এর মতো প্রিসেট প্রতি ফাইল নাম ও প্রতি অপারেশনে সময় যোগ করতে পারে।15 ফাইল সিস্টেম বা ফিল্টার ড্রাইভারে ডিস্কে পৌঁছানোর আগে সময় খরচ করা কেস Disk Usage-এ আসে না, তাই অমিল নিজেই — “Disk Usage শান্ত কিন্তু File I/O ধীর” — সূত্র। সিঙ্ক্রোনাস ও অ্যাসিঙ্ক্রোনাস I/O-এর যন্ত্রপাতি থেকে শুরু করতে চাইলে “সিঙ্ক্রোনাস ও অ্যাসিঙ্ক্রোনাস I/O — OVERLAPPED সত্যি কী মানে” দেখুন।
flowchart TB
accTitle: File IO ও Disk Usage যে আলাদা স্তর দেখে
accDescr: অ্যাপের ফাইল অপারেশন ফাইল সিস্টেম ও ফিল্টার ড্রাইভার হয়ে OS I/O কিউ থেকে ডিস্ক ডিভাইসে যায়। File IO উপরের স্তরে অপারেশন রেকর্ড করে; Disk Usage ডিস্কে পৌঁছানো I/O; IO Time ও Disk Service Time-এর পার্থক্য কিউ সময়
app["অ্যাপ: ReadFile / WriteFile"] --> fio["FS ও ফিল্টার(File I/O)"]
fio --> queue["OS I/O কিউ"]
queue --> dev["ডিস্ক ডিভাইস(Disk Usage)"]
fio -.-> n1["Disk Usage মিস করে"]
queue -.-> n2["IO Time − Service Time"]
dev -.-> n3["Service Time = ডিভাইস"]
চিত্র 10: অ্যাপের ফাইল অপারেশন ফাইল সিস্টেম ও ফিল্টার ড্রাইভার হয়ে OS I/O কিউ থেকে ডিস্ক ডিভাইসে যায়। File IO উপরের স্তরে অপারেশন রেকর্ড করে; Disk Usage ডিস্কে পৌঁছানো I/O; IO Time ও Disk Service Time-এর পার্থক্য কিউ সময়।
“হয়তো মেমোরি কম আর সোয়াপ হচ্ছে” চিন্তা Task Manager ও Resource Monitor-এ প্রথম আলাদা করা যায়, WPA-তে যাওয়ার আগে। তবে কমিটেড মেমোরি একা থেকে খারিজ করবেন না — কমিট জায়গা থাকলেও ভৌত-মেমোরি চাপ ওয়ার্কিং সেট কেটে হার্ড ফল্ট চালিয়ে যেতে পারে। উপলব্ধ ভৌত মেমোরি ও Resource Monitor-এর “Hard Faults/sec”ও দেখুন। কীভাবে পড়বেন “Windows-এর "মেমোরি ব্যবহার" সত্যি কী মানে“-এ আছে।
৮. ধীর বুট ও লগঅন — বুট ট্রেসের প্রবেশ
“স্টার্ট হতে ৩ মিনিট লাগে” ধরন হাতে wpr -start চালানোর আগেই শেষ হয়। WPR-এ বুট ট্রেস আছে, আর পরের বুটে OS স্বয়ংক্রিয়ভাবে রেকর্ডিং শুরু করার ব্যবস্থা করা যায়।3
:: 1. Arrange automatic recording on the next boot
wpr -boottrace -addboot GeneralProfile -filemode
:: 2. Restart (reproduce the slow boot)
:: 3. After boot, stop recording and save (the arrangement is also cleared)
mkdir C:\temp 2>nul
wpr -boottrace -stopboot C:\temp\boot.etl "Issue where boot takes 3 minutes"
flowchart TB
accTitle: বুট-ট্রেস প্রবাহ
accDescr: addboot দিয়ে পরের বুটে স্বয়ংক্রিয় রেকর্ডিং ব্যবস্থা করে রিস্টার্টের পর OS বুটে নিজে রেকর্ড করে। লগঅনের পর stopboot দিয়ে সেভ ব্যবস্থাও খালি করে। ত্যাগ করতে cancelboot দিয়ে খালি করুন
add["wpr -boottrace -addboot"] --> rebootpc["রিস্টার্ট(ধীর বুট)"]
rebootpc --> auto["OS বুটে রেকর্ড করে"]
auto --> stop2["লগঅনের পর: -stopboot"]
add -.-> cancel["ত্যাগ: -cancelboot"]
চিত্র 11: addboot দিয়ে পরের বুটে স্বয়ংক্রিয় রেকর্ডিং ব্যবস্থা করে রিস্টার্টের পর OS বুটে নিজে রেকর্ড করে। লগঅনের পর stopboot দিয়ে সেভ ব্যবস্থাও খালি করে। ত্যাগ করতে cancelboot দিয়ে খালি করুন।
বুট ও শাটডাউন মাপ যা আগে xbootmgr-এর ছিল বর্তমান WPR-এ -onoffscenario Boot-এর মতো অপশনেও চালানো যায়।3 ক্যাপচার করা ট্রেস আগের অধ্যায়ের একই টুলকিট দিয়ে পড়া হয়। Processes গ্রাফে টাইমলাইনে কোন প্রক্রিয়া কখন জন্মেছে দেখুন, বুট আটকে থাকা জানালায় জুম করুন, আর CPU, অপেক্ষা বা ডিস্ক শ্রেণিবিভাগ করুন — সিরিজে কিছু অপেক্ষা করা স্টার্টআপ অ্যাপ, নির্দিষ্ট I/O-তে আটকে থাকা সার্ভিস স্টার্ট ইত্যাদি দেখা যায়। বুট বিশ্লেষণ নিজেই গভীর বিশেষত্ব, তাই এই নিবন্ধ শুধু প্রবেশ পর্যন্ত যায়: “হাতে ধরা যায় না এমন সমস্যাও WPR দিয়ে ক্যাপচার করা যায়”। GeneralProfile বুট ট্রেস দিয়ে সামগ্রিক ছবি ধরে শুরু করুন।
৯. কাজের আকৃতি — শ্রেণিবিভাগ → জুম → স্ট্যাক, বারবার
টুল স্পষ্ট হলে পুরো অনুসন্ধানের আকৃতি এই।
- ঘটনার সময় পিন করুন। “ধীর ছিল” নয়, “১০:২৩:৪০–১০:২৪:১০ ধীর ছিল”। অ্যাপ লগ, ইভেন্ট লগ, অপারেটরের নোট — যা-ই হোক। নিজের অ্যাপ চেকপয়েন্ট ETW বা ইভেন্ট লগে লিখলে ট্রেসের ভিতরের ইভেন্ট যেমন আছে তেমন সময়ের খুঁটি হয়ে যায়।
- শুধু সেই অন্তরালে জুম করুন। পুরো ট্রেসের যোগ গড় হয়ে যায়, আর গুরুত্বপূর্ণ অস্বাভাবিকতা পাতলা হয়। WPA বিশ্লেষণ সবসময় “অস্বাভাবিক অন্তরাল” বনাম “স্বাভাবিক অন্তরাল” তুলনা।
- আগে “CPU, অপেক্ষা, না I/O” শ্রেণিবিভাগ করুন। CPU Usage (Sampled) দেখুন; জ্বললে অধ্যায় ৫। না জ্বললে CPU Usage (Precise)-এর Waits (অধ্যায় ৬)। Disk Usage IO Time ফুলে থাকলে অধ্যায় ৭। এই তিন-পথ আগে নিলে হারাবেন না।
- অনুমান → জুম → স্ট্যাক পুনরাবৃত্তি করুন। “অ্যান্টিভাইরাস?” ভাবলে সেই প্রক্রিয়ায় সঙ্কুচিত করে স্ট্যাক দিয়ে সমর্থন করুন। না দাঁড়ালে পরের অনুমান। স্ট্যাক পর্যন্ত চলে সমর্থন করার আগে সিদ্ধান্ত না টানা এই ধরনের অনুসন্ধানের শৃঙ্খলা।
flowchart TB
accTitle: পারফরম্যান্স অনুসন্ধানের পুনরাবৃত্তি লুপ
accDescr: ঘটনার সময় পিন করুন, অন্তরালে জুম করুন, CPU / অপেক্ষা / I/O শ্রেণিবিভাগ করুন, অনুমান করে সঙ্কুচিত করুন, আর স্ট্যাক দিয়ে সমর্থন করুন। দাঁড়ালে কারণ নিশ্চিত; না হলে পরের অনুমানে পুনরাবৃত্তি
time["সময় পিন করুন"] --> zoomstep["সেই অন্তরালে জুম"]
zoomstep --> triage["CPU / অপেক্ষা / I/O শ্রেণিবিভাগ"]
triage --> hypo["অনুমান ও সঙ্কোচন"]
hypo --> stack["স্ট্যাক দিয়ে সমর্থন"]
stack -->|"দাঁড়ায়"| fix["কারণ নিশ্চিত"]
stack -->|"না"| hypo
চিত্র 12: ঘটনার সময় পিন করুন, অন্তরালে জুম করুন, CPU / অপেক্ষা / I/O শ্রেণিবিভাগ করুন, অনুমান করে সঙ্কুচিত করুন, আর স্ট্যাক দিয়ে সমর্থন করুন। দাঁড়ালে কারণ নিশ্চিত; না হলে পরের অনুমানে পুনরাবৃত্তি।
শেষে ক্যাপচার ফাইল সামলানো। ETL ফাইল সিস্টেমের ভিতরকে ব্যাপকভাবে প্রতিফলিত করে: প্রতিটি প্রক্রিয়ার নাম, খোলা ফাইলের পথ, লোড মডিউল, আর (প্রোফাইল অনুযায়ী) রেজিস্ট্রি কী নাম। মানক GeneralProfile ক্যাপচারে যোগাযোগ বিষয়বস্তুর মতো ডেটা দেহ থাকে না, কিন্তু কাস্টম প্রোভাইডার চালু করলে সেই ইভেন্টের পেলোড (অ্যাপ রেকর্ড করা স্ট্রিং ইত্যাদি) যেমন আছে তেমন যায়। যে প্রোভাইডার চালু করেছেন তারা কী ছাড়ে নিশ্চিত করে, কোম্পানি ছাড়ার মতো গোপন ফাইল হিসেবে ধরুন। প্যাকেট ক্যাপচারের মতো ন্যূনতম প্রয়োজন ক্যাপচার, যাকে দেবেন তার সাথে সম্মতি, আর রাখার মেয়াদ ও মুছে ফেলা পদ্ধতিতে ভাঁজ করুন।
flowchart TB
accTitle: ETL ফাইল কী প্রতিফলিত করে, আর কীভাবে সামলাবেন
accDescr: ETL প্রতিটি প্রক্রিয়ার নাম, খোলা ফাইলের পথ, মডিউল, আর প্রোফাইল অনুযায়ী রেজিস্ট্রি কী নাম প্রতিফলিত করে; কাস্টম প্রোভাইডার চালু করলে তার পেলোডও যায়। গোপন ধরুন: ন্যূনতম প্রয়োজন ক্যাপচার, অন্য পক্ষের সম্মতি, আর রাখার মেয়াদ ও মুছে ফেলা
etl["ETL ফাইল"] --> a1["নাম, পথ, মডিউল"]
a1 --> a2["রেজিস্ট্রি কী(কিছু)"]
a2 --> a3["কাস্টম পেলোড"]
a3 -.-> rule["গোপন ধরুন"]
চিত্র 13: ETL প্রতিটি প্রক্রিয়ার নাম, খোলা ফাইলের পথ, মডিউল, আর প্রোফাইল অনুযায়ী রেজিস্ট্রি কী নাম প্রতিফলিত করে; কাস্টম প্রোভাইডার চালু করলে তার পেলোডও যায়। গোপন ধরুন: ন্যূনতম প্রয়োজন ক্যাপচার, অন্য পক্ষের সম্মতি, আর রাখার মেয়াদ ও মুছে ফেলা।
১০. সারসংক্ষেপ
- Task Manager যে “পুরো PC ধীর” ব্যাখ্যা করতে পারে না, OS-ব্যাপী ETW ট্রেস দিয়ে অনুসন্ধান হয় — WPR দিয়ে ক্যাপচার, WPA দিয়ে পড়ুন। wpr.exe Windows 8.1 ও পরবর্তীতে সাথে আসে, তাই গ্রাহক পরিবেশে ক্যাপচার, ETL বাড়ি নেওয়া, আর নিজের মেশিনে WPA-তে পড়া টেকে।
- ক্যাপচার তিন ধাপ
wpr -start GeneralProfile -filemode→ পুনরুৎপাদন →wpr -stop trace.etl। পুনরুৎপাদন করতে পারলে কয়েক মিনিটে File মোড; অপেক্ষা করলে Memory মোড (রিং বাফার)। দীর্ঘতর ভালো নয়। - WPA তিন পয়েন্ট নিলে শুরু করা যায়: টেবিলের সোনালি নিয়ম (সোনার বারের বাঁয়ে = গ্রুপিং), সময়সীমা জুম, আর সিম্বল কনফিগারেশন (নিজের অ্যাপে PDB লাগে)।
- CPU বেশি হলে CPU Usage (Sampled)-এ প্রক্রিয়া → স্ট্যাক → ফাংশন চলুন। CPU কম অথচ ধীর হলে CPU Usage (Precise)-এ শৃঙ্খল NewThreadStack (থামার সময় কী করছিল) → Waits (কতক্ষণ অপেক্ষা) → ReadyingProcess ও ReadyThreadStack (কে জাগিয়েছে) মূল পর্যন্ত চলুন।
- ডিস্কের জন্য Disk Usage IO Time ও Service Time-এর পার্থক্য থেকে “কিউতে কাটানো সময়” দেখুন, আর কারণ (ডিভাইস নিজে ধীর, না কে কিউ তৈরি করেছে) Service Time ও প্রক্রিয়া, পথ, স্ট্যাক ভাঙন থেকে চিনুন। ধীর বুট
wpr -boottraceদিয়ে ক্যাপচার করা যায়। - কাজের আকৃতি (১) সময় পিন (২) অন্তরালে জুম (৩) CPU, অপেক্ষা বা I/O শ্রেণিবিভাগ (৪) অনুমান → জুম → স্ট্যাক পুনরাবৃত্তি। ETL গোপন ধরুন কারণ তাতে অভ্যন্তরীণ তথ্য আছে।
WPA-র পর্দা ভয় দেখায়, আর প্রথম ঘণ্টায় সবাই হারায়। দুই মেরুদণ্ড — “সোনার বারের বাঁয়ে গ্রুপিং” আর “Sampled যেখানে জ্বলেছে, Precise কার অপেক্ষা” — বসলে বাকি একই কাজের পুনরাবৃত্তি। পরেরবার “CPU-তে জায়গা আছে অথচ ধীর” পরামর্শ এলে Task Manager বন্ধ করে ট্রেস ক্যাপচার করুন।
সম্পর্কিত নিবন্ধ
- PerfView ও dotnet-trace দিয়ে “ধীর” পিন করা — .NET পারফরম্যান্স অনুসন্ধানের ব্যবহারিক ভূমিকা
- Process Monitor (ProcMon)-এর ব্যবহারিক নির্দেশিকা — ১০ মিনিটে “সেটিং প্রয়োগ হয়নি” ও “ACCESS DENIED” পিন করা
- Windows Event Log ও ETW-এর ভূমিকা — ব্যবসায়িক অ্যাপের লগ OS-এর মানক যন্ত্রে রাখা
- Windows-এর “মেমোরি ব্যবহার” সত্যি কী মানে? — Working Set, Private Bytes, Commit ও পেজ ফাইল সঠিক পড়া
- Windows Processor Scheduling সেটিংস - ব্যাকগ্রাউন্ড সার্ভিস ও P/E কোর
- PDB (Program Database) কী? — ডিবাগ তথ্য, সিম্বল ও Source Link বোঝা
সম্পর্কিত পরামর্শ ক্ষেত্র
KomuraSoft LLC “পুরো PC ধীর হয়ে গেছে আর জানি না কেন”, “CPU-তে জায়গা আছে অথচ অ্যাপ ধীর”, আর “শুধু একটি নির্দিষ্ট পরিবেশ স্টার্ট হতে অত্যন্ত ধীর” ধরনের সিস্টেম-ব্যাপী পারফরম্যান্স সমস্যার অনুসন্ধান সামলায়। আমরা WPR/WPA দিয়ে ক্যাপচার ডিজাইন (কোন পরিবেশে, কোন প্রোফাইল, কতটা ক্যাপচার), ট্রেস বিশ্লেষণ, আর ফলস্বরূপ অ্যাপ পাশ ও সেটিং পাশের সমাধান এক অবিচ্ছিন্ন কাজ হিসেবে সামলাই।
- Windows অ্যাপ্লিকেশন ডেভেলপমেন্ট
- বাগ অনুসন্ধান ও মূল কারণ বিশ্লেষণ
- টেকনিক্যাল কনসালটিং ও ডিজাইন রিভিউ
- যোগাযোগ করুন
তথ্যসূত্র
-
Microsoft Learn, Introduction to WPR. যে WPR ETW-ভিত্তিক পারফরম্যান্স রেকর্ডিং টুল; যে কমান্ড-লাইন সংস্করণ WPR.exe Windows 8.1 ও পরবর্তীতে অতিরিক্ত ইনস্টল ছাড়াই সাথে আসে; GUI সংস্করণ WPRUI.exe-এর সাথে সম্পর্ক; আর রেকর্ডিং প্রোফাইলের ধারণা। ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Windows Performance Analyzer. যে WPA Windows ADK-তে অন্তর্ভুক্ত, WPR, Xperf ইত্যাদি রেকর্ড করা ETW ইভেন্ট থেকে গ্রাফ ও ডেটা টেবিল গড়া বিশ্লেষণ টুল, আর যেকোনো ETL ফাইল খুলে বিশ্লেষণ করতে পারে। ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, WPR Command-Line Options. wpr -start/-stop/-cancel/-status/-profiles-এর সিনট্যাক্স; -filemode (ডিফল্ট মেমোরি মোড); একসাথে একাধিক প্রোফাইল নির্দিষ্ট করা; -boottrace দিয়ে বুট ট্রেস (addboot/stopboot/cancelboot); আর -onoffscenario দিয়ে Boot-এর মতো On/Off রূপান্তর রেকর্ড করা। ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn, CPU Analysis. CPU Usage (Precise) গ্রাফ কলামের সংজ্ঞা (NewThreadStack, ReadyThreadStack, ReadyingProcess, Waits ইত্যাদি); ReadyThreadStack প্রসারিত করে ReadyingProcess/ReadyingThread অপেক্ষার মূল কারণ পর্যন্ত চলার পদ্ধতি; আর KiTimerExpiration (টাইমার অপেক্ষা) বা I/O সম্পূর্ণতা থেকে জাগ চেনা। ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Troubleshoot processes and threads by using WPR and WPA. উচ্চ CPU ব্যবহারে CPU Usage (Sampled) Process→Stack পড়া, আর অপেক্ষা বিশ্লেষণে CPU Usage (Precise) Readying Process, Readying Thread, Readying Stack ও Wait কলাম ব্যবহারের মতো কনফিগারেশন; আর উপসর্গ অনুযায়ী প্রোফাইল ও গ্রাফের মিল টেবিল। ↩ ↩2
-
Microsoft Learn, Exercise 2 - Evaluate Fast Startup Using Windows Performance Toolkit. যে CPU Usage (Sampled) প্রায় ১-মিলিসেকেন্ড অন্তরালে স্যাম্পলিং আর স্যাম্পলের মাঝের ছোট কার্যকলাপ রেকর্ড হয় না; প্রক্রিয়া → থ্রেড → স্ট্যাক চলে CPU খরচের ভাঙন চেনার পদ্ধতি; আর Disk Usage IO Time (কিউ সময়সহ) ও Disk Service Time (ডিস্ক প্রক্রিয়া সময়)-এর অর্থ। ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Exercise 3 - Understand Critical Path and Wait Analysis. ক্রিটিক্যাল-পাথ বিশ্লেষণের ধারণা (Running / Ready / Waiting শ্রেণিবিভাগ); CPU Usage (Precise) টেবিল কলাম NewThreadStack, ReadyThreadStack, ReadyingProcess, Waits, Ready ইত্যাদির অর্থ; আর জাগানোর থ্রেড পালাক্রমে চলে বিলম্ব শৃঙ্খল খোলার পদ্ধতি। ↩ ↩2 ↩3
-
Microsoft Learn, Loading Symbols. যে _NT_SYMBOL_PATH আনসেট থাকলে WPA ডিফল্টে Microsoft-এর পাবলিক সিম্বল সার্ভার (msdl.microsoft.com) দেখে; নিজের কম্পোনেন্টের জন্য PDB পথ যোগ; আর যে WPR .NET managed সিম্বলের জন্য ট্রেসের পাশে .ngenpdb ফোল্ডারে PDB তৈরি করে আর WPA স্বয়ংক্রিয়ভাবে দেখে। ↩ ↩2 ↩3
-
Microsoft Learn, Built-in Recording Profiles. WPR-এ বিল্ট-ইন রেকর্ডিং প্রোফাইলের তালিকা (CPU ব্যবহার, Disk I/O কার্যকলাপ, File I/O কার্যকলাপ, Registry I/O কার্যকলাপ, Networking I/O কার্যকলাপ ও অন্যান্য) আর প্রতিটি প্রোফাইল কী রেকর্ড করে। ↩
-
Microsoft Learn, Logging Mode. যে রেকর্ডিং মোড File (অবিচ্ছিন্ন ফাইল) ও Memory (ইন-মেমোরি বৃত্তাকার বাফার) এবং ডিফল্ট Memory; যে Memory সময় জানা নেই এমন সমস্যার জন্য উপযোগী আর পুরনো ইভেন্ট ওভাররাইট হয়; আর যে File-এর একমাত্র ছাদ খালি ডিস্ক স্থান এবং খুব বড় ফাইল WPA-তে বিশ্লেষণ-অযোগ্য হতে পারে। ↩ ↩2
-
Microsoft Learn, WPR How-to Topics. WPRUI-তে রেকর্ডিং শুরু ও থামানোর পদ্ধতি; প্রোফাইল, বিস্তারিত স্তর ও Logging mode বাছা; আর সতর্কতা যে দীর্ঘ রেকর্ডিং ফাইল বিশাল ও WPA-তে বিশ্লেষণ-অযোগ্য করতে পারে, তাই Memory মোড বাছা উচিত। ↩ ↩2
-
Microsoft Learn, Graph Explorer. যে Graph Explorer উইন্ডো System Activity, Computation, Storage ও Memory-এর মতো শ্রেণিতে গ্রাফ থাম্বনেইল তালিকা করে; আর গ্রাফ Analysis ট্যাবে টেনে টেবিলের সাথে দেখানো হয়। ↩
-
Microsoft Learn, Graphs (WPA Features). WPA-র Flame গ্রাফ প্রদর্শন; টেবিল কাঠামো যেখানে সোনার বারের বাঁদিকের কলাম গ্রুপিং আর নীল বারের ডানদিকের কলাম যোগফল; আর CPU Usage (Sampled) Flame by Process, Stack প্রিসেট। ↩ ↩2
-
Microsoft Learn, Load Symbols or Configure Symbol Paths. WPA-র Trace মেনু থেকে Load Symbols দিয়ে সিম্বল লোড; আর Configure Symbol Paths ডায়ালগে সিম্বল পথ সেট ও বদলানোর পদ্ধতি। ↩
-
Microsoft Learn, List of WPA Graphs. WPA-তে উপলব্ধ গ্রাফের তালিকা। Disk Usage প্রিসেট যেমন IO Time by Process, IO Type; Service Time by Process, Path Name, Stack; Utilization by Process, Path Name, Stack; আর File I/O প্রিসেট যেমন Duration by Process, Thread, Type। ↩ ↩2 ↩3
সম্পর্কিত নিবন্ধ
কাছাকাছি বিষয়ে গভীরে যেতে একই ট্যাগযুক্ত সাম্প্রতিক নিবন্ধ।
ঘুম থেকে জাগলে ভাঙে যে অ্যাপ — Windows পাওয়ার ইভেন্টের কাজ ও যে ব্যবসায়িক অ্যাপ তা সহ্য করে
ল্যাপটপ খুললেন আর ব্যবসায়িক অ্যাপের সংযোগ মৃত — কারণ ঘুম ধরে না নেওয়া ডিজাইন। এই নিবন্ধ WM_POWERBROADCAST নোটিফিকেশন প্রবাহ, Modern Sta...
DllMain ও লোডার লক — DLL ইনিশিয়ালাইজেশনে "কিছুই করবেন না" বলা হয় তার আসল কারণ
DllMain থেকে LoadLibrary ডাকা বা অন্য থ্রেডের সাথে সিঙ্ক্রোনাইজ করা যায় না কেন। প্রাথমিক উৎস থেকে এই নিবন্ধ ব্যাখ্যা করে লোডার লক প্রতিট...
"Not Responding" আসলে কী — Windows কীভাবে অ্যাপ হ্যাং ধরে, আর যে ডিজাইন হ্যাং করে না
Windows-এর "Not Responding" এমন যন্ত্র যেখানে OS বিচার করে উইন্ডো ৫ সেকেন্ড মেসেজ তোলেনি আর তাকে ঘোস্ট উইন্ডো দিয়ে বদলায়। এই নিবন্ধ সেই...
Win32 থ্রেড পুল API — CreateThreadpoolWork দিয়ে থ্রেড তৈরি না করে কনকারেন্সি
নেটিভ কোডে চারদিকে CreateThread ডাকছেন? এই নিবন্ধ Vista-তে নতুন করে সাজানো Win32 থ্রেড পুল API ব্যাখ্যা করে — work, timer, wait ও io চারট...
নেমড পাইপ ব্যবহারিকভাবে — ডিজাইন থেকে নিরাপত্তা পর্যন্ত Windows-এর মানক IPC
Windows-এর মানক আন্তঃপ্রক্রিয়া যোগাযোগ নেমড পাইপের ব্যবহারিক গাইড। প্রাথমিক উৎস থেকে এই নিবন্ধ বাইট ও মেসেজ মোডের পছন্দ, একাধিক ক্লায়েন...
সম্পর্কিত বিষয়
এই পৃষ্ঠাগুলো বিষয়টিকে সেবা ও সিদ্ধান্তের বৃহত্তর প্রেক্ষাপটে স্থাপন করে।
Windows-এর প্রযুক্তিগত বিষয়
Windows ডেভেলপমেন্ট, বাগ তদন্ত ও বিদ্যমান সম্পদ ব্যবহারের প্রবেশদ্বার।
এই বিষয়ের সাথে সম্পর্কিত সেবা
নিবন্ধটি নিচের সেবাগুলোর সাথে সরাসরি সম্পর্কিত।
Windows অ্যাপ ডেভেলপমেন্ট
ব্যবসায়িক অ্যাপ, ডিভাইস ইন্টিগ্রেশন ও যোগাযোগ টুল, চাহিদা থেকে ডেভেলপমেন্ট পর্যন্ত।
প্রায়শ জিজ্ঞাসিত প্রশ্ন
এই নিবন্ধের বিষয়ে পরামর্শে প্রায়ই আসা প্রশ্ন।
- WPR ও WPA কোথায় পাব? সফটওয়্যার ইনস্টল করা যায় না এমন গ্রাহক পরিবেশে ব্যবহার করা যায়?
- ক্যাপচার টুল wpr.exe (কমান্ড-লাইন সংস্করণ) Windows 8.1 ও পরবর্তীতে সাথে আসে, তাই অতিরিক্ত ইনস্টল ছাড়াই ব্যবহার করা যায়। GUI সংস্করণ WPRUI ও বিশ্লেষণ টুল WPA (Windows Performance Analyzer) Windows ADK (Windows Assessment and Deployment Kit)-এ অন্তর্ভুক্ত এবং আলাদা ইনস্টল লাগে। বাস্তবে কাজ ভাগ করলে "গ্রাহক পরিবেশে শুধু OS-মানক wpr.exe দিয়ে ETL ফাইল ক্যাপচার করুন, বাড়ি নিয়ে যান, আর নিজের মেশিনে WPA-তে বিশ্লেষণ করুন", সফটওয়্যার যোগ করা যায় না এমন সাইটেও সিস্টেম-ব্যাপী পারফরম্যান্স অনুসন্ধান করা যায়।
- Task Manager-এ CPU ফাঁকা দেখালেও ধীর কেন? WPA-তে কী দেখা যায়?
- CPU ব্যবহার কম অথচ ধীর হলে কাজ CPU ব্যবহার করতে পারছে না তা নয় — সে "কিছু অপেক্ষা করে" থেমে আছে। লক বিরোধ, সিঙ্ক্রোনাস I/O শেষ হওয়ার অপেক্ষা, আর অন্য প্রক্রিয়ার জবাবের অপেক্ষা সাধারণ। Task Manager শুধু ফল, ব্যবহার, দেখায়; WPA-র CPU Usage (Precise) প্রতি-কентиক্সট-সুইচ রেকর্ড থেকে দেখায় থ্রেড কোথায় অপেক্ষা শুরু করেছে (NewThreadStack), কতক্ষণ অপেক্ষা করেছে (Waits), আর কে জাগিয়েছে (ReadyingProcess, ReadyThreadStack)। যে পক্ষ অপেক্ষা করিয়েছে তার পেছনে গিয়ে "ধীরতার অপরাধী" ফাংশন পর্যন্ত চেনা যায়।
- ট্রেস কতক্ষণ ক্যাপচার করব? ফাইল কি বিশাল হয়ে যাবে না?
- সমস্যা পুনরুৎপাদন করতে পারলে ভিত্তি হলো পুনরুৎপাদনের ঠিক আগে শুরু, ঠিক পরে থামানো, আর কয়েক মিনিটের মধ্যে রাখা। WPR-এর ডিফল্ট Memory মোড, যা ইন-মেমোরি বৃত্তাকার বাফারে রেকর্ড করে; পুরনো ইভেন্ট ওভাররাইট হয়, তাই সময় জানা নেই এমন সমস্যার অপেক্ষার জন্য উপযোগী। File মোড, -filemode দিয়ে, সবকিছু অবিচ্ছিন্ন ফাইলে রাখে, কিন্তু একমাত্র ছাদ খালি ডিস্ক স্থান, আর খুব বড় ফাইল WPA-তে বিশ্লেষণ-অযোগ্য হতে পারে। দীর্ঘ অপেক্ষায় Memory মোড, ছোট নির্ভরযোগ্য পুনরুৎপাদনে File মোড।
- PerfView ও WPA-র মধ্যে কীভাবে বেছে নেব?
- দুই টুলই ETW ট্রেস সামলায়, কিন্তু শক্তি আলাদা। PerfView .NET রানটাইম গভীরভাবে বোঝে এবং GC, অ্যালোকেশন, JIT-এর মতো managed-অ্যাপ অনুসন্ধানে শক্তিশালী। WPA OS-ব্যাপী CPU, ডিস্ক, ফাইল I/O, পাওয়ার ইত্যাদি গ্রাফ ও টেবিলে পড়তে উপযোগী, আর প্রথম পছন্দ যখন "কোনো নির্দিষ্ট অ্যাপ নয় পুরো PC ধীর", "একাধিক প্রক্রিয়া জড়িত", বা "অ্যাপের বাইরে কিছু (অ্যান্টিভাইরাস, ড্রাইভার, অন্য প্রক্রিয়া) সন্দেহ"। নিয়ম: শুধু নিজের .NET অ্যাপের ধীরতার জন্য PerfView, পুরো সিস্টেমের ধীরতার জন্য WPR/WPA।
- গ্রাহকের প্রোডাকশন পরিবেশে WPR চালানো কি ঠিক?
- ছোট ক্যাপচার বাস্তবে সাধারণ, কিন্তু শর্তহীন নিরাপদ নয়। ETW হালকা, কিন্তু স্ট্যাকসহ বিপুল ইভেন্ট রেকর্ড করলে নির্দিষ্ট CPU ও মেমোরি খরচ হয়। পুনরুৎপাদন ধাপের ঠিক আগে শুরু ও ঠিক পরে থামানো, ক্যাপচার কয়েক মিনিটের মধ্যে রাখা, আর ব্যবসায়িক প্রভাব কম সময়ে চালানো — এগুলো সাধারণ পরিবর্তনের মতোই অনুমোদন প্রক্রিয়ায় ভাঁজ করুন। আর ETL ফাইলে প্রক্রিয়ার নাম, ফাইল পথ, এক্সিকিউটেবল তথ্যের মতো অভ্যন্তরীণ সিস্টেম তথ্য থাকে, তাই কোম্পানি ছেড়ে গেলে কীভাবে সামলানো হবে (ন্যূনতমকরণ, রাখার মেয়াদ, মুছে ফেলা) আগেই স্থির করুন।