如何检索Windows容器的内存使用情况?

问题描述 投票:0回答:1

在 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 容器内存使用情况的信息吗?

windows kubernetes winapi containers windows-container
1个回答
0
投票

我想确定 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 上的性能计数器测量特定 Windows 容器的内存使用情况有点复杂。

您首先需要确定适当的性能计数器: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)。将计数器路径中的 

*

 替换为确切的实例名称以监视特定容器。

© www.soinside.com 2019 - 2024. All rights reserved.