2

我们有我们的 vmware 环境,从中我们能够通过 dot net API 找出分配的内存和 CPU,我们还想找出它的 CPU 和内存利用率(Max、Min、Avg)。但是,我们无法在 dot net api (VCloudSDK_V5_5) 中找到任何方法或属性,因此,我需要 dot net 代码示例来了解 vmware 环境中的 cpu 和内存利用率。我到处找,但我找不到。

任何 C# 代码示例?

我们正在尝试使用此代码:

http://vmware-gadget.googlecode.com/svn-history/r19/trunk/Vmware-Gadget/VmwareReader/VMPerfCounter.cs

我们参考 VimService dll 实现了一个示例,但我们无法通过它进行连接。

我们收到错误:请求失败并显示错误消息...

错误在以下在线方法中(_sic = _service.RetrieveServiceContent(_svcRef);)

System.Net.ServicePointManager.CertificatePolicy = new Program();
            //Gets service contents
            _svcRef.type = "ServiceInstance";
            _svcRef.Value = "ServiceInstance";

            // _service is VimService
            _service = new VimService();
            _service.Url = url;
            _service.CookieContainer = new CookieContainer();

            // _sic is ServiceContent
            _sic = _service.RetrieveServiceContent(_svcRef);  // Error at this line

            _service.LoginCompleted += new LoginCompletedEventHandler(_service_LoginCompleted);
            _session = _service.Login(_sic.sessionManager, usid, pwd, null); 

但是,没有错误消息。有人可以帮忙吗?

4

2 回答 2

1

这里有一些不错的 API 文档

实际上,我自己刚刚开始了一个类似的项目,并且能够使用此代码示例作为起点。用户 Coffeetocode 提供了关于启动和运行 .net api 的非常简单的演练。

从那里,使用上述 API 文档查找各种成员名称。

例如:

           string provisioned_disk_space = "" + ((vm.Summary.Storage.Uncommitted + vm.Summary.Storage.Committed) / 1073741824);
           string used_disk_space = "" + (vm.Summary.Storage.Committed / 1073741824);
           string number_of_cpus = "" + vm.Summary.Config.NumCpu;
           string total_ram = "" + (vm.Summary.Config.MemorySizeMB/1024);

我认为你正在寻找的成员是

            VirtualMachine.Summary.QuickStats.GuestMemoryUsage;
            VirtualMachine.Summary.QuickStats.OverallCpuUsage;
于 2014-03-07T17:52:28.893 回答
1

您可能应该查看vSphere Guest API 文档,在这里您可以找到执行此类监控的函数。您可以使用DllImport方法为vmGuestLib.dll. 要了解如何从 C# 访问这些方法,请阅读Consuming Unmanaged DLL Functions并查看DllImport的文档。

以下是,和函数的示例DllImport定义:VMGuestLib_OpenHandleVMGuestLib_GetMemActiveMBVMGuestLib_CloseHandle

using System.Runtime.InteropServices;
public enum VMGuestLibError {
    VMGUESTLIB_ERROR_SUCCESS = 0,
    VMGUESTLIB_ERROR_OTHER,
    VMGUESTLIB_ERROR_NOT_RUNNING_IN_VM,
    VMGUESTLIB_ERROR_NOT_ENABLED,
    VMGUESTLIB_ERROR_NOT_AVAILABLE,
    VMGUESTLIB_ERROR_NO_INFO,
    VMGUESTLIB_ERROR_MEMORY,
    VMGUESTLIB_ERROR_BUFFER_TOO_SMALL,
    VMGUESTLIB_ERROR_INVALID_HANDLE,
    VMGUESTLIB_ERROR_INVALID_ARG,
    VMGUESTLIB_ERROR_UNSUPPORTED_VERSION
};
[DllImport("vmGuestLib.dll")] public static extern VMGuestLibError VMGuestLib_OpenHandle(ref IntPtr handle);
[DllImport("vmGuestLib.dll")] public static extern VMGuestLibError VMGuestLib_GetMemActiveMB(IntPtr handle, ref UInt32 memActiveMB);
[DllImport("vmGuestLib.dll")] public static extern VMGuestLibError VMGuestLib_CloseHandle(IntPtr handle);
于 2014-01-29T03:33:00.923 回答