CloudStack VM运行状态的监控-Management

VM和Host的运行时刻状态,应该是所有虚拟化平台管理员最热切的关注点。

本文章介绍下CloudStack中,对于VM运行状态信息的获取和扩展。

信息获取原理

Management-Server在启动的时候,会初始化1个线程,用于定期获取定期获取运行时数据。

对于3个主流Hyperviser:KVM、XenServer、VMware,分别调用Libvirt API、 XenServer RRD API和 VMware API来获取当前运行时状态。

定期获取状态之后,会上报到该线程,和之前的上报的数据进行累加,以得到统计全量。

所以,CloudStack对于VM状态的监控,是从Management-Server启动到当前时间的历史统计数据,并非瞬时值。

代码解析

StatsController.java

该类继承了ComponentLifecycle,在Management-Server 启动的时候,会加载start方法,启动后台服务。

@Override
public boolean start() {
    init(_configDao.getConfiguration());
    return true;
}

其中 init() 方法,会读取全局配置中的设置,初始化不同的监控进程

Source code
private void init(Map<String, String> configs) {
    _executor = Executors.newScheduledThreadPool(4, new NamedThreadFactory("StatsCollector"));

    ......
    hostAndVmStatsInterval = NumbersUtil.parseLong(configs.get("vm.stats.interval"), 60000L);
    ......
    if (hostAndVmStatsInterval > 0) {
        _executor.scheduleWithFixedDelay(new VmStatsCollector(), 15000L, hostAndVmStatsInterval, TimeUnit.MILLISECONDS);
    }
    ......
}

代码可以看出,从全局设置中里面获取vm.stats.interval变量,默认为60s,即1分钟。如果想修改调整时间,可以在全局配置中进行修改。

VmStatsCollector是线程类,集成ManagedContextRunnable。

VmStatsCollector列出全部可用Host,然后按Host进行遍历,查询Host上所有VM当前运行状态,与历史值进行累加,代码如下:

class VmStatsCollector extends ManagedContextRunnable {
        @Override
        protected void runInContext() {
            try {
                ......
                SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria();
                ......//创建查询条件
                List<HostVO> hosts = _hostDao.search(sc, null);

                for (HostVO host : hosts) {
                    List<UserVmVO> vms = _userVmDao.listRunningByHostId(host.getId());
                    ......
                    try {
                        HashMap<Long, VmStatsEntry> vmStatsById = _userVmMgr.getVirtualMachineStatistics(host.getId(), host.getName(), vmIds);
                        if (vmStatsById != null) {
                            ......
                            //新VM,加入map中
                        } else {
                            //已有历史数据VM,进行更新,CPU记录最新值,Disk和Network进行累加
                                statsInMemory.setCPUUtilization(statsForCurrentIteration.getCPUUtilization());
                                    statsInMemory.setNumCPUs(statsForCurrentIteration.getNumCPUs());
                                    statsInMemory.setNetworkReadKBs(statsInMemory.getNetworkReadKBs() + statsForCurrentIteration.getNetworkReadKBs());
                                    statsInMemory.setNetworkWriteKBs(statsInMemory.getNetworkWriteKBs() + statsForCurrentIteration.getNetworkWriteKBs());
                                    statsInMemory.setDiskWriteKBs(statsInMemory.getDiskWriteKBs() + statsForCurrentIteration.getDiskWriteKBs());
                                    statsInMemory.setDiskReadIOs(statsInMemory.getDiskReadIOs() + statsForCurrentIteration.getDiskReadIOs());
                                    statsInMemory.setDiskWriteIOs(statsInMemory.getDiskWriteIOs() + statsForCurrentIteration.getDiskWriteIOs());
                                    statsInMemory.setDiskReadKBs(statsInMemory.getDiskReadKBs() + statsForCurrentIteration.getDiskReadKBs());
                                    _VmStats.put(vmId, statsInMemory);
    ......
    }

_userVmMgr.getVirtualMachineStatistics() 方法中,向Hyperviser发送Cmd,查询所需信息,代码如下:

public HashMap<Long, VmStatsEntry> getVirtualMachineStatistics(long hostId, String hostName, List<Long> vmIds) throws CloudRuntimeException {
        ......
        Answer answer = _agentMgr.easySend(hostId, new GetVmStatsCommand(vmNames, _hostDao.findById(hostId).getGuid(), hostName));
        ......
    }

GetVmStatsCommand会发送到Hyperviser相关进程,并由Hyperviser相关进程调用API或 Cloud-Agent 服务进行处理,处理结果返回到当前线程进行处理,最终由VmStatsCollector进行合并。

在ListVm过程中,如果需要得到VM运行时状态,则调用StatsController的getVmStats来获取。

在Hyperviser的相关文件中,各有接受GetVmStatsCommand并进行处理的相关逻辑,下篇帖子会继续介绍Hyperviser中相关逻辑。

CloudStack VM运行状态的监控-HypervisorGetVmStatsCommand会发送到Hyperviser相关进程,并由Hyperviser相关进程调用API或 Cloud-Agent 服务进行处理,处理结果返回到当前线程进行处理,最终由VmStatsCollector进行合并。

在ListVm过程中,如果需要得到VM运行时状态,则调用StatsController的getVmStats来获取。

在Hyperviser的相关文件中,各有接受GetVmStatsCommand并进行处理的相关逻辑,下篇帖子会继续介绍Hyperviser中相关逻辑。

CloudStack VM运行状态的监控-Hypervisor

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-23 15:21:07

CloudStack VM运行状态的监控-Management的相关文章

mongostat和mongotop对mongodb数据库运行状态进行监控

--mongostat工具是mongdb自带的监控工具,可以用来监控mongodb当前状态下的运行情况: [[email protected] ~]# /usr/local/mongodb341/bin/mongostat 2insert query update delete getmore command dirty used flushes vsize   res qrw arw net_in net_out conn                time    *0    *0    

MySQL性能调优与架构设计——第 18 章 高可用设计之 MySQL 监控

第 18 章 高可用设计之 MySQL 监控 前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一个系统,无论如何设计如何维护,都无法完全避免出现异常的可能,监控系统就是根据系统的各项状态的分析,让我们能够尽可能多的提前预知系统可能会出现的异常状况.即使没有及时发现将要发生的异常,也要在异常出现后的第一时间知道系统已经出现异常,否则之前的设计工作很可能就白费了. 18.1 监控系统设计 系统监控

Keepalived 资源监控

简介: 作为一个高可用集群软件,Keepalived 没有 Heartbeat .RHCS 等专业的高可用集群软件功能强大,它不能够实现集群资源的托管,也不能实现对集群中运行服务的监控,好在 Keepalived 也考虑到了这一点,它提供了 vrrp_script .notify_master .notify_backup 等多个功能模块,通过这些模块也可以实现对集群资源的托管以及集群服务的监控. ## 下面是一个 Keepalived 主备切换的演示过程 shell > curl 192.16

大规模视频监控系统将以云存储为主

随着高清技术的普及,720P.1080P视频已经遍地开花,同时基于对 清晰度的追求,时候智能分析的处理,500W.800W.甚至上千万更高分辨率的摄像机开始崭露头角:如此高清的监控,问题也伴随而来:高清视频数据动辄 几G到几十G的文件,对存储设备的容量.读写性能.可靠性.扩展性等都提出了更高的要求,对于存储厂商而言也面临着更大的挑战:如何在视频监控系统中选用 适宜的数据存储解决方案,显得格外重要.站在系统建设角度考虑,需要充分考虑功能集成度.数据安全性.数据稳定性,系统可扩展性.性能及成本各方面

基于SignalR实现B/S系统对windows服务运行状态的监测

通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windows服务肯定是必不可少的,我们还需要利用B/S与windows服务进行交互,来实现更好的用户体验,搭配redis,memcached等来实现分布式缓存,消息列队处理等等... 但是通常情况我们在B/S端是无法得知其依赖的windows服务当前处于什么样的运行状态,只能通过到server里面去进行查看,或者通过其他途径! 今天我们就通过SignalR来实现一个B/S端

使用JMX监控Kafka

Kafka可以配置使用JMX进行运行状态的监控,既可以通过JDK自带Jconsole来观察结果,也可以通过Java API的方式来. 关于监控指标的描述,可以参考:http://kafka.apache.org/documentation.html#monitoring 开启JMX端口 修改bin/kafka-server-start.sh,添加JMX_PORT参数,添加后样子如下 if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then exp

zabbix 监控项(key)

Key 描述 返回值 参数 详细说明 agent.hostname 返回被监控端名称 字符串 - 返回配置文件中配置的被监控端的名称 agent.ping 检测被监控端是否存活 1 - 运行中 其他 - 未运行 - 使用函数 nodata()检测客户端是否正在运行 agent.version zabbix agent版本 字符串 - 例如返回: 1.8.2 kernel.maxfiles 系统支持最大的open files 整数 kernel.maxproc 系统支持最大的进程数量 整数 log

基于prometheus的监控解决方案

一.前言 鄙人就职于某安全公司,团队的定位是研发安全产品云汇聚平台,为用户提供弹性伸缩的云安全能力.前段时间产品组提出了一个监控需求,大致要求:平台对vm实行动态实时监控,输出相应图表界面,并提供警报(资源不足等问题而产生)等功能. 二.方案调研 经过团队调研,目前业界流行的监控方案大致有这么几种:基于 zabbix 的.基于 prometheus 的.基于 influxdb 等时序数据库的.结合当前我们的业务场景来讲,zabbix对我们来说有点重,而 influxdb 方案灵活但是投入的研发时

CloudStack+KVM环境搭建(步骤很详细,说明ClockStack是用来管理虚拟机的)

文章目录环境准备配置本地域名解析关闭selinux安装ntp服务安装管理端安装Mysql数据库安装服务端RPM:初始化CloudStack数据库:初始化cloudstack管理服务器安装系统虚拟机安装Agent端创建Zone(资源域)本文以4.11.1.0版本为例,使用的hypervisor类型为KVM,操作系统为RedHat7/CentOS7,官方安装文档参考:http://docs.cloudstack.apache.org/projects/cloudstack-installation/