summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2011-07-07 14:05:56 -0400
committerNat Goodspeed <nat@lindenlab.com>2011-07-07 14:05:56 -0400
commit6c0d6956da046df9638932030d4c95ff299ca76f (patch)
treec82ffbc429522a9eec1c284e69aa9ab5f3c7e3ea
parentd16a0afe2eeab45b6b1c1a640548a4273da6267e (diff)
CHOP-753: add stats from GetProcessMemoryInfo() on Windows.
Introduce StatsArray helper class to facilitate accumulating stats in the array-of-pair-arrays form cached internally by LLMemoryInfo.
-rw-r--r--indra/llcommon/llsys.cpp96
1 files changed, 66 insertions, 30 deletions
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index e0ce74234d..cec1cd90e9 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -58,7 +58,8 @@ using namespace llsd;
# define WIN32_LEAN_AND_MEAN
# include <winsock2.h>
# include <windows.h>
-# include <psapi.h>
+# include <psapi.h> // GetPerformanceInfo() et al.
+# include <kfuncs.h> // GetCurrentProcess()
#elif LL_DARWIN
# include <errno.h>
# include <sys/sysctl.h>
@@ -640,6 +641,26 @@ void LLCPUInfo::stream(std::ostream& s) const
s << "->mCPUString: " << mCPUString << std::endl;
}
+// Helper class for LLMemoryInfo: accumulate stats in the array-of-pair-arrays
+// form we store for LLMemoryInfo::getStatsArray().
+class StatsArray
+{
+public:
+ StatsArray():
+ mStats(LLSD::emptyArray())
+ {}
+
+ void add(const LLSD::String& name, LLSD::Integer value)
+ {
+ mStats.append(LLSDArray(name)(value));
+ }
+
+ LLSD get() const { return mStats; }
+
+private:
+ LLSD mStats;
+};
+
LLMemoryInfo::LLMemoryInfo()
{
refresh();
@@ -859,39 +880,54 @@ LLMemoryInfo& LLMemoryInfo::refresh()
LLSD LLMemoryInfo::loadStatsArray()
{
// This implementation is derived from stream() code (as of 2011-06-29).
- LLSD statsArray(LLSD::emptyArray());
+ StatsArray stats;
#if LL_WINDOWS
MEMORYSTATUSEX state;
state.dwLength = sizeof(state);
GlobalMemoryStatusEx(&state);
- statsArray.append(LLSDArray("Percent Memory use")(LLSD::Integer(state.dwMemoryLoad)));
- statsArray.append(LLSDArray("Total Physical KB") (LLSD::Integer(state.ullTotalPhys/1024)));
- statsArray.append(LLSDArray("Avail Physical KB") (LLSD::Integer(state.ullAvailPhys/1024)));
- statsArray.append(LLSDArray("Total page KB") (LLSD::Integer(state.ullTotalPageFile/1024)));
- statsArray.append(LLSDArray("Avail page KB") (LLSD::Integer(state.ullAvailPageFile/1024)));
- statsArray.append(LLSDArray("Total Virtual KB") (LLSD::Integer(state.ullTotalVirtual/1024)));
- statsArray.append(LLSDArray("Avail Virtual KB") (LLSD::Integer(state.ullAvailVirtual/1024)));
+ stats.add("Percent Memory use", state.dwMemoryLoad);
+ stats.add("Total Physical KB", state.ullTotalPhys/1024);
+ stats.add("Avail Physical KB", state.ullAvailPhys/1024);
+ stats.add("Total page KB", state.ullTotalPageFile/1024);
+ stats.add("Avail page KB", state.ullAvailPageFile/1024);
+ stats.add("Total Virtual KB", state.ullTotalVirtual/1024);
+ stats.add("Avail Virtual KB", state.ullAvailVirtual/1024);
PERFORMANCE_INFORMATION perf;
perf.cb = sizeof(perf);
GetPerformanceInfo(&perf, sizeof(perf));
SIZE_T pagekb(perf.PageSize/1024);
- statsArray.append(LLSDArray("CommitTotal KB") (LLSD::Integer(perf.CommitTotal * pagekb)));
- statsArray.append(LLSDArray("CommitLimit KB") (LLSD::Integer(perf.CommitLimit * pagekb)));
- statsArray.append(LLSDArray("CommitPeak KB") (LLSD::Integer(perf.CommitPeak * pagekb)));
- statsArray.append(LLSDArray("PhysicalTotal KB") (LLSD::Integer(perf.PhysicalTotal * pagekb)));
- statsArray.append(LLSDArray("PhysicalAvail KB") (LLSD::Integer(perf.PhysicalAvailable * pagekb)));
- statsArray.append(LLSDArray("SystemCache KB") (LLSD::Integer(perf.SystemCache * pagekb)));
- statsArray.append(LLSDArray("KernelTotal KB") (LLSD::Integer(perf.KernelTotal * pagekb)));
- statsArray.append(LLSDArray("KernelPaged KB") (LLSD::Integer(perf.KernelPaged * pagekb)));
- statsArray.append(LLSDArray("KernelNonpaged KB")(LLSD::Integer(perf.KernelNonpaged * pagekb)));
- statsArray.append(LLSDArray("PageSize KB") (LLSD::Integer(pagekb)));
- statsArray.append(LLSDArray("HandleCount") (LLSD::Integer(perf.HandleCount)));
- statsArray.append(LLSDArray("ProcessCount") (LLSD::Integer(perf.ProcessCount)));
- statsArray.append(LLSDArray("ThreadCount") (LLSD::Integer(perf.ThreadCount)));
+ stats.add("CommitTotal KB", perf.CommitTotal * pagekb);
+ stats.add("CommitLimit KB", perf.CommitLimit * pagekb);
+ stats.add("CommitPeak KB", perf.CommitPeak * pagekb);
+ stats.add("PhysicalTotal KB", perf.PhysicalTotal * pagekb);
+ stats.add("PhysicalAvail KB", perf.PhysicalAvailable * pagekb);
+ stats.add("SystemCache KB", perf.SystemCache * pagekb);
+ stats.add("KernelTotal KB", perf.KernelTotal * pagekb);
+ stats.add("KernelPaged KB", perf.KernelPaged * pagekb);
+ stats.add("KernelNonpaged KB", perf.KernelNonpaged * pagekb);
+ stats.add("PageSize KB", pagekb);
+ stats.add("HandleCount", perf.HandleCount);
+ stats.add("ProcessCount", perf.ProcessCount);
+ stats.add("ThreadCount", perf.ThreadCount);
+
+ PROCESS_MEMORY_COUNTERS_EX pmem;
+ pmem.cb = sizeof(pmem);
+ GetProcessMemoryInfo(GetCurrentProcess(), &pmem, sizeof(pmem));
+
+ stats.add("Page Fault Count", pmem.PageFaultCount);
+ stats.add("PeakWorkingSetSize KB", pmem.PeakWorkingSetSize/1024);
+ stats.add("WorkingSetSize KB", pmem.WorkingSetSize/1024);
+ stats.add("QutaPeakPagedPoolUsage KB", pmem.QuotaPeakPagedPoolUsage/1024);
+ stats.add("QuotaPagedPoolUsage KB", pmem.QuotaPagedPoolUsage/1024);
+ stats.add("QuotaPeakNonPagedPoolUsage KB", pmem.QuotaPeakNonPagedPoolUsage/1024);
+ stats.add("QuotaNonPagedPoolUsage KB", pmem.QuotaNonPagedPoolUsage/1024);
+ stats.add("PagefileUsage KB", pmem.PagefileUsage/1024);
+ stats.add("PeakPagefileUsage KB", pmem.PeakPagefileUsage/1024);
+ stats.add("PrivateUsage KB", pmem.PrivateUsage/1024);
#elif LL_DARWIN
uint64_t phys = 0;
@@ -900,7 +936,7 @@ LLSD LLMemoryInfo::loadStatsArray()
if (sysctlbyname("hw.memsize", &phys, &len, NULL, 0) == 0)
{
- statsArray.append(LLSDArray("Total Physical KB")(LLSD::Integer(phys/1024)));
+ stats.add("Total Physical KB", phys/1024);
}
else
{
@@ -962,7 +998,7 @@ LLSD LLMemoryInfo::loadStatsArray()
<< "' in vm_stat line: " << line << LL_ENDL;
continue;
}
- statsArray.append(LLSDArray("page size")(pagesizekb));
+ stats.add("page size", pagesizekb);
}
else if (boost::regex_match(line, matched, stat_rx))
{
@@ -988,7 +1024,7 @@ LLSD LLMemoryInfo::loadStatsArray()
continue;
}
// Store this statistic.
- statsArray.append(LLSDArray(key)(value));
+ stats.add(key, value);
// Is this in units of pages? If so, convert to Kb.
static const LLSD::String pages("Pages ");
if (key.substr(0, pages.length()) == pages)
@@ -996,7 +1032,7 @@ LLSD LLMemoryInfo::loadStatsArray()
// Synthesize a new key with kb in place of Pages
LLSD::String kbkey("kb ");
kbkey.append(key.substr(pages.length()));
- statsArray.append(LLSDArray(kbkey)(value * pagesizekb));
+ stats.add(kbkey, value * pagesizekb);
}
}
else if (boost::regex_match(line, matched, cache_rx))
@@ -1018,7 +1054,7 @@ LLSD LLMemoryInfo::loadStatsArray()
<< "' in vm_stat line: " << line << LL_ENDL;
continue;
}
- statsArray.append(LLSDArray(cache_keys[i])(value));
+ stats.add(cache_keys[i], value);
}
}
else
@@ -1034,7 +1070,7 @@ LLSD LLMemoryInfo::loadStatsArray()
phys = (U64)(sysconf(_SC_PHYS_PAGES)) * (U64)(sysconf(_SC_PAGESIZE)/1024);
- statsArray.append(LLSDArray("Total Physical KB")(phys));
+ stats.add("Total Physical KB", phys);
#elif LL_LINUX
std::ifstream meminfo(MEMINFO_FILE);
@@ -1085,7 +1121,7 @@ LLSD LLMemoryInfo::loadStatsArray()
continue;
}
// Store this statistic.
- statsArray.append(LLSDArray(key)(value));
+ stats.add(key, value);
}
else
{
@@ -1104,7 +1140,7 @@ LLSD LLMemoryInfo::loadStatsArray()
#endif
- return statsArray;
+ return stats.get();
}
LLSD LLMemoryInfo::loadStatsMap(const LLSD& statsArray)