In my previous post I showed how DBAs can be provided with read-only access to Virtual Center for monitoring VM performance in the data-center One thing that many administrators don’t realize or think about is that Virtual Center uses a database for storing information about the virtual data center and the most common database platform used for this purpose is SQL Server. Virtual Center can use an existing SQL Server in the environment, or it can install SQL Server Express during setup.
As a consultant, I do a lot of reviews of SQL Servers running on VMware, and as part of that work I have to understand the underlying virtualization configuration – not just for SQL Server, but for the virtualized data center. This includes needing information about the host configuration, other VMs running on the host, and performance metrics from the VM historical data that is stored in the VIM_VCDB database used by vCenter.
The VIM_VCDB database isn’t entirely documented, but a list of the views and their definitions can be found in the Using VirtualCenter Database Views technical note from VMware. Using this information, and additional information collected using a server-side trace against the database while working in vCenter, I’ve compiled a series of Transact-SQL scripts for pulling information from the VIM_VCDB database in an environment.
The first time I ever demonstrated these scripts was last week during the Virtualization module of our IE3: High Availability and Disaster Recovery course in Chicago. I’m also using these scripts in the Pluralsight course on SQL Server Virtualization that I am currently recording. When I demonstrated these scripts last week, the first question the class asked was where can they get them. We always provide the scripts from our demos to students, but I also promised to blog them as well this week.
Host Configuration
The VPXV_HOSTS view provides host level information and I commonly JOIN that view to the VPXV_VMS view to aggregate VM information per host as a part of a environment health check.
-- Host Configuration SELECT vh.NAME AS HOST_NAME, HOST_MODEL, CPU_MODEL, CPU_COUNT, CPU_CORE_COUNT, CPU_HZ, CPU_THREAD_COUNT, SUM(CASE WHEN vm.POWER_STATE = N'On' THEN vm.NUM_VCPU ELSE 0 END) AS VM_VCPU_ACTIVE, MEM_SIZE, SUM(CASE WHEN vm.POWER_STATE = N'On' THEN vm.NUM_VCPU ELSE 0 END)*1./CPU_THREAD_COUNT AS THREAD_OVERCommit, SUM(CASE WHEN vm.POWER_STATE = N'On' THEN vm.NUM_VCPU ELSE 0 END)*1./CPU_CORE_COUNT AS CORE_OVERCommit, CAST(MEM_SIZE AS BIGINT)/1024/1024 AS MEM_SIZE_MB, SUM(CASE WHEN vm.POWER_STATE = N'On' THEN vm.MEM_SIZE_MB ELSE 0 END) AS VM_MEM_SIZE_MB, SUM(CASE WHEN vm.POWER_STATE = N'On' THEN vm.MEM_SIZE_MB ELSE 0 END)*1./(CAST(MEM_SIZE AS BIGINT)/1024/1024) AS MEM_OVERCommit, SUM(CAST(vm.MEMORY_OVERHEAD AS BIGINT)) AS VM_MEMORY_OVERHEAD, SUM(vm.MEM_SIZE_MB) AS VM_MEM_SIZE_MB_POTENTIAL, SUM(vm.NUM_VCPU) AS VM_VCPU_ALLOC_POTENTIAL, NIC_COUNT, HBA_COUNT, SUM(CASE WHEN vm.VMMWARE_TOOL = N'OK' THEN 1 ELSE 0 END) AS VM_TOOLS_OK, SUM(CASE WHEN vm.VMMWARE_TOOL = N'Old' THEN 1 ELSE 0 END) AS VM_TOOLS_OUT_OF_DATE, SUM(vm.NUM_VCPU) AS VM_VCPU_ALLOC FROM dbo.VPXV_HOSTS AS vh INNER JOIN dbo.VPXV_VMS AS vm ON vh.HOSTID = vm.HOSTID GROUP BY vh.NAME, HOST_MODEL, CPU_MODEL, CPU_COUNT, CPU_CORE_COUNT, CPU_HZ, CPU_THREAD_COUNT, MEM_SIZE, NIC_COUNT, HBA_COUNT;
Performance Counter Information
Performance counters are maintained historically in the VIM_VCDB database at multiple roll-up levels. The VPXV_HIST_STAT_DAILY view has the daily roll-up values for each of the VMs and the VPXV_HIST_STAT_WEEKLY view has the weekly roll-up values.
Querying individual counter values and making decisions is not appropriate for all counters. An example of this is the CPU Ready counter which has to be calculated from the roll-up summation to determine if a problem actually exists (see CPU Ready Time in VMware and How to Interpret its Real Meaning). Two counters that I look at for the virtual data center and all of the VMs are CPU Ready and Memory Ballooned (vmmemctl).
CPU Ready Values
-- Daily %RDY values SELECT vh.NAME AS HostName, vv.NAME AS GuestName, SAMPLE_TIME, SAMPLE_INTERVAL, (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 AS READY_PERCENT, CASE WHEN (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 > 5 AND (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 < 10 THEN N'WARN' WHEN (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 > 10 THEN N'RED' ELSE N'OK' END AS CPURDY_State, STAT_VALUE AS CPUReady_Summation, NUM_VCPU FROM dbo.VPXV_HIST_STAT_DAILY AS vhsd INNER JOIN dbo.VPXV_VMS AS vv ON vhsd.ENTITY = N'vm-'+CAST(vv.VMID AS NVARCHAR) INNER JOIN dbo.VPXV_HOSTS AS vh ON vv.HOSTID = vh.HOSTID WHERE STAT_GROUP = N'cpu' AND STAT_NAME = N'ready' AND CASE WHEN (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 > 5 AND (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 < 10 THEN N'WARN' WHEN (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 > 10 THEN N'RED' ELSE N'OK' END <> N'OK' ORDER BY CPURDY_State, READY_PERCENT DESC; -- Weekly %RDY values SELECT vh.NAME AS HostName, vv.NAME AS GuestName, SAMPLE_TIME, SAMPLE_INTERVAL, (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 AS READY_PERCENT, CASE WHEN (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 > 5 AND (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 < 10 THEN N'WARN' WHEN (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 > 10 THEN N'RED' ELSE N'OK' END AS CPURDY_State, STAT_VALUE AS CPUReady_Summation, NUM_VCPU FROM dbo.VPXV_HIST_STAT_WEEKLY AS vhsd INNER JOIN dbo.VPXV_VMS AS vv ON vhsd.ENTITY = N'vm-'+CAST(vv.VMID AS NVARCHAR) INNER JOIN dbo.VPXV_HOSTS AS vh ON vv.HOSTID = vh.HOSTID WHERE STAT_GROUP = N'cpu' AND STAT_NAME = N'ready' AND CASE WHEN (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 > 5 AND (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 < 10 THEN N'WARN' WHEN (STAT_VALUE/ (vv.NUM_VCPU * SAMPLE_INTERVAL * 1000)) * 100 > 10 THEN N'RED' ELSE N'OK' END <> N'OK' ORDER BY CPURDY_State, READY_PERCENT DESC;
Memory Ballooning Counters
-- Weekly Memory Ballooned SELECT vh.NAME AS HostName, vv.NAME AS VMName, Start, Finish, tab.SAMPLE_INTERVAL, MIN(STAT_VALUE)/1024. AS MinBallooned_MB, MAX(STAT_VALUE)/1024. AS MaxBallooned_MB, AVG(STAT_VALUE)/1024. AS AvgBallooned_MB, COUNT(*) * (tab.SAMPLE_INTERVAL/60) AS MinutesBallooned FROM dbo.VPXV_HIST_STAT_WEEKLY AS vhsd INNER JOIN dbo.VPXV_VMS AS vv ON vhsd.ENTITY = N'vm-'+CAST(vv.VMID AS NVARCHAR) INNER JOIN dbo.VPXV_HOSTS AS vh ON vv.HOSTID = vh.HOSTID CROSS JOIN (SELECT MIN(SAMPLE_TIME) AS Start, MAX(SAMPLE_TIME) AS Finish, SAMPLE_INTERVAL FROM dbo.VPXV_HIST_STAT_WEEKLY WHERE STAT_NAME = N'vmmemctl' AND STAT_VALUE > 0 GROUP BY SAMPLE_INTERVAL) AS tab WHERE STAT_NAME = N'vmmemctl' AND STAT_VALUE > 0 GROUP BY vh.Name, vv.Name, Start, Finish, tab.SAMPLE_INTERVAL ORDER BY HostName, MinutesBallooned DESC; -- Daily Memory Ballooned SELECT vh.NAME AS HostName, vv.NAME AS VMName, Start, Finish, tab.SAMPLE_INTERVAL, MAX(STAT_VALUE)/1024. AS MaxBallooned_MB, AVG(STAT_VALUE)/1024. AS AvgBallooned_MB, COUNT(*) * (tab.SAMPLE_INTERVAL/60) AS MinutesBallooned FROM dbo.VPXV_HIST_STAT_DAILY AS vhsd INNER JOIN dbo.VPXV_VMS AS vv ON vhsd.ENTITY = N'vm-'+CAST(vv.VMID AS NVARCHAR) INNER JOIN dbo.VPXV_HOSTS AS vh ON vv.HOSTID = vh.HOSTID CROSS JOIN (SELECT MIN(SAMPLE_TIME) AS Start, MAX(SAMPLE_TIME) AS Finish, SAMPLE_INTERVAL FROM dbo.VPXV_HIST_STAT_DAILY WHERE STAT_NAME = N'vmmemctl' AND STAT_VALUE > 0 GROUP BY SAMPLE_INTERVAL) AS tab WHERE STAT_NAME = N'vmmemctl' AND STAT_VALUE > 0 GROUP BY vh.Name, vv.Name, Start, Finish, tab.SAMPLE_INTERVAL ORDER BY HostName, MinutesBallooned DESC;
Summary
The VIM_VCDB contains a lot more information than I’ve covered in this post. These are simply examples of the types of information that you can query from the database as a part of troubleshooting problems or evaluating the configuration of a virtual data center. One of the important things about having access to this data is to always validate that you are applying the appropriate understanding to the values being stored in the database.
The post Querying the VMware vCenter Database (VCDB) for Performance and Configuration Information appeared first on Jonathan Kehayias.