C++ प्रक्रिया से CPU और मेमोरी मापने का पूरा गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

प्रदर्शन की अंधी जगह: आपकी प्रक्रिया को कैसे पता चले कि वह कितना संसाधन खा रही है?

\n\n

कल्पना करें: आपने C++ में एक जटिल एप्लिकेशन लिखा है, वह चल रहा है, लेकिन धीमा होने लगता है। आप top, htop या टास्क मैनेजर चलाते हैं — और देखते हैं कि आपकी प्रक्रिया 90% CPU या गीगाबाइट्स मेमोरी खा रही है। लेकिन प्रक्रिया को खुद यह एहसास कैसे कराया जाए कि वह ज़्यादा लोड ले रही है, और वह डायनामिक रूप से लोड कम करे या कैश साफ़ करे?

\n\n

यह सिर्फ अकादमिक रुचि नहीं है। प्रोडक्शन एनवायरनमेंट में, बिना GUI वाले सर्वर पर, आप बाहरी टूल्स पर निर्भर नहीं रह सकते। ज़रूरी है कि प्रोग्राम खुद अपनी निगरानी करे। Stack Overflow पर यही लोकप्रिय सवाल है: "How to determine CPU and memory consumption from inside a process"। आइए इसे C++ में वास्तविक उदाहरणों के साथ समझते हैं।

\n\n

क्रॉस-प्लेटफ़ॉर्म दुविधा: Linux बनाम Windows

\n\n

ऑपरेटिंग सिस्टम प्रक्रिया सांख्यिकी तक पहुँचने के अलग-अलग तरीके देते हैं। Linux में /proc वर्चुअल फ़ाइल सिस्टम है, जबकि Windows Win32 API का उपयोग करता है। हम एक यूनिवर्सल क्लास बनाएंगे जो दोनों प्लेटफ़ॉर्म पर काम करेगा।

\n\n

हम जिन मुख्य मीट्रिक्स को निकालेंगे:

\n
    \n
  • CPU उपयोग (प्रतिशत या कोर के अंश में)
  • \n
  • भौतिक मेमोरी (RSS) — वास्तव में उपयोग की गई RAM
  • \n
  • वर्चुअल मेमोरी (VSZ) — कुल एड्रेस स्पेस का आकार
  • \n
\n\n

Linux पर CPU पढ़ना: /proc/self/stat का जादू

\n\n

प्रक्रिया का CPU समय प्राप्त करने के लिए /proc/self/stat फ़ाइल पढ़ें। इसमें दर्जनों फ़ील्ड होते हैं, हमें फ़ील्ड 13-16 (utime, stime, cutime, cstime) चाहिए — ये टिक्स (jiffies) में समय हैं। प्रतिशत में बदलने के लिए, टिक फ़्रीक्वेंसी (sysconf(_SC_CLK_TCK)) और सिस्टम का कुल समय जानना ज़रूरी है।

\n\n
#ifdef __linux__\n#include <unistd.h>\n#include <fstream>\n#include <sstream>\n#include <string>\n#include <vector>\n\ndouble getCpuUsageLinux() {\n    static unsigned long long prevTotal = 0, prevIdle = 0;\n    static double prevProcessTicks = 0;\n    static bool first = true;\n\n    // प्रक्रिया का समय\n    std::ifstream procStat("/proc/self/stat");\n    std::string line;\n    std::getline(procStat, line);\n    std::istringstream iss(line);\n    std::vector<std::string> fields;\n    std::string field;\n    while (iss >> field) fields.push_back(field);\n\n    unsigned long utime = std::stoul(fields[13]);\n    unsigned long stime = std::stoul(fields[14]);\n    unsigned long cutime = std::stoul(fields[15]);\n    unsigned long cstime = std::stoul(fields[16]);\n    double processTicks = utime + stime + cutime + cstime;\n\n    // सिस्टम का समय\n    std::ifstream statFile("/proc/stat");\n    std::getline(statFile, line);\n    statFile.close();\n    std::istringstream iss2(line);\n    std::string cpuLabel;\n    iss2 >> cpuLabel;\n    unsigned long long user, nice, system, idle, iowait, irq, softirq, steal;\n    iss2 >> user >> nice >> system >> idle >> iowait >> irq >> softirq >> steal;\n    unsigned long long total = user + nice + system + idle + iowait + irq + softirq + steal;\n\n    if (first) {\n        prevTotal = total;\n        prevIdle = idle;\n        prevProcessTicks = processTicks;\n        first = false;\n        return 0.0;\n    }\n\n    unsigned long long totalDelta = total - prevTotal;\n    double processDelta = processTicks - prevProcessTicks;\n    double cpuPercent = (processDelta / totalDelta) * 100.0;\n\n    prevTotal = total;\n    prevIdle = idle;\n    prevProcessTicks = processTicks;\n\n    return cpuPercent;\n}\n#endif\n
\n\n

यह कोड पहली कॉल के बाद से प्रक्रिया द्वारा उपयोग किए गए CPU का प्रतिशत निकालता है। ध्यान दें: हम दो मापों के बीच का अंतर लेते हैं — सटीकता के लिए यह मानक तरीका है।

\n\n

Linux पर मेमोरी: RSS और VSZ

\n\n

मेमोरी के लिए /proc/self/status पढ़ें। हमें इन पंक्तियों की ज़रूरत है

ब्लॉग

पुस्तक अनुशंसाएँ