在 Linux 下,可以读取控制文件
memory.usage_in_bytes
(对于控制组 v1)或 memory.current
(对于 控制组 v2)。如何获取Windows容器的内存使用情况?
根据Windows资源管理Kubernetes文档,进程隔离的Windows概念是关于作业对象。我发现可以通过提供 PeakJobMemoryUsed
来获取
JOBOBJECT_EXTENDED_LIMIT_INFORMATION信息。然而,查询此信息似乎需要更高的权限(因为我得到了
Could not get job information: [0x0005] Access is denied.
)。
还有其他方法可以获取有关 Windows 容器内存使用情况的信息吗?
我想确定 C++ 程序的内存使用情况
为了扩展 YangXiaoPo-MSFT 的 评论,我只是尝试在我的 PC 上(尽管在 Kubernetes 设置之外)使用 Performance Data Helper (PDH) 库以编程方式从 C++ 检索这些指标:
我将pdh.lib
添加到我的链接器输入中,并将其用于:
GPUProcessMemoryQuery.cpp:
#include <windows.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <iostream>
int main()
{
PDH_HQUERY hQuery = NULL;
PDH_HCOUNTER hCounter = NULL;
PDH_STATUS pdhStatus = PdhOpenQuery(NULL, NULL, &hQuery);
if (pdhStatus != ERROR_SUCCESS)
{
std::cerr << "Failed to open PDH query.\n";
return 1;
}
pdhStatus = PdhAddCounter(hQuery, L"\\GPU Process Memory(*)\\Dedicated Usage", 0, &hCounter);
if (pdhStatus != ERROR_SUCCESS)
{
std::cerr << "Failed to add PDH counter.\n";
return 1;
}
pdhStatus = PdhCollectQueryData(hQuery);
if (pdhStatus != ERROR_SUCCESS)
{
std::cerr << "Failed to collect PDH query data.\n";
return 1;
}
PDH_FMT_COUNTERVALUE counterValue;
pdhStatus = PdhGetFormattedCounterValue(hCounter, PDH_FMT_LONG, NULL, &counterValue);
if (pdhStatus != ERROR_SUCCESS)
{
std::cerr << "Failed to get formatted counter value.\n";
return 1;
}
std::wcout << L"GPU Process Memory (Dedicated Usage): " << counterValue.longValue << L"\n";
PdhCloseQuery(hQuery);
return 0;
}
我得到了:GPU Process Memory (Dedicated Usage): 35549184
,无需提升权限。
您首先需要确定适当的性能计数器:Windows 容器的性能指标应位于
Hyper-V Container
或类似名称空间下(这可能会根据 Windows Server 版本和容器运行时而变化)。在深入研究 C++ 之前,您可能需要使用
Performance Monitor
(在 Windows 开始菜单中键入
perfmon
)来浏览与容器相关的可用计数器。这将使您了解可用的内容以及您需要在代码中使用的确切路径。
一旦你找到了正确的逆向路径:
// Change this line:
pdhStatus = PdhAddCounter(hQuery, L"\\GPU Process Memory(*)\\Dedicated Usage", 0, &hCounter);
// To something like:
pdhStatus = PdhAddCounter(hQuery, L"\\Hyper-V Container\\Memory Metric (or appropriate counter)", 0, &hCounter);
确定您感兴趣的计数器实例至关重要,因为每个容器都应该有自己的实例。在性能监视器中,您可以查看每个计数器的实例(例如各个容器名称或 ID)。将计数器路径中的 *
替换为确切的实例名称以监视特定容器。