- A+
node_exporter安装非常简单,只要解压后直接后台运行即可,默认端口是9100
安装部署
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz tar xvf node_exporter-1.0.1.linux-amd64.tar.gz mv node_exporter-1.0.1.linux-amd64 /usr/local/node_exporter
创建启动脚本
cat > /usr/lib/systemd/system/node_exporter.service <<EOF [Unit] Description=node_exporter [Service] ExecStart=/usr/local/node_exporter/node_exporter --web.listen-address=:9100 --collector.systemd --collector.systemd.unit-whitelist="(ssh|docker|rsyslog|redis-server).service" --collector.textfile.directory=/usr/local/node_exporter/textfile.collected Restart=on-failure [Install] WantedBy=multi-user.target EOF
启动服务
systemctl enable node_exporter systemctl start node_exporter.service lsof -i:9100
浏览器访问,可以看到当前node节点状态up,其余两台down没部署node_exporter组建
启动参数说明
1、启用systemd收集器
systemd收集器记录systemd中的服务和系统状态。首先需要通过参数--collector.systemd启用该收集器,同时如果不希望收集所有的服务,只收集部分关键服务,node_exporter在启动时可以使用--collector.systemd.unit-whitelist参数配置指定的服务。
2、指定textfile收集器目录
使用textfile收集器可以让用户添加自定义的度量指标,功能类似pushgateway,同zabbix中自定义的item一样,只要将度量指标和值按照prometheus规范的格式输出到指定位置且以.prom后缀文件保存,textfile收集器会自动读取collector.textfile.directory目录下所有以.prom结尾的文件,并提取所有格式为Prometheus的指标暴露给Prometheus来抓取。
textfile收集器默认是开启的,我们只需要指定--collector.textfile.directory的路径即可。
--collector.textfile.directory=/usr/local/node_exporter/textfile.collected
3、启用或禁用收集器
/usr/local/node_exporter/node_exporter -h
可以看到默认启用了哪些收集器(default: enabled),若要禁用某个收集器,如
--collector.ntp,可以修改为 --no-collector.ntp,即禁用该收集器。
创建自定义收集目录
mkdir /usr/local/node_exporter/textfile.collected
创建自定义监控项
例如:需要监控系统登录用户数
# echo "node_login_users $(who |wc -l)" > /usr/local/node_exporter/textfile.collected/login_users.prom # echo "node_processes $(ps -ef |wc -l)" > /usr/local/node_exporter/textfile.collected/node_processes.prom
以crontab定时任务的方式采集
*/1 * * * * echo "login_users $(who |wc -l)" > /usr/local/node_exporter/textfile.collected/login_users.prom */1 * * * * echo "login_users $(who |wc -l)" > /usr/local/node_exporter/textfile.collected/node_processes.prom
监控系统资源的方法论
在google sre handbook中提出了评估系统是否存在问题,用户体验是否受影响,用四个黄金信号来判断:Latency(延迟)、Traffic(流量)、Errors(错误数)、Saturation(饱和度)。
但在系统资源监控用得较多的方法是"USE"方法,分别表示为:Utilization(使用率)、Saturation(饱和度)、Errors(错误数)
1、CPU使用率监控
(1- (avg(irate(node_cpu_seconds_total{nodename=~"monitor01",mode="idle"}[5m])))) * 100
或者
100 - (avg(irate(node_cpu_seconds_total{nodename=~"monitor01",mode="idle"}[5m])) * 100)
2、内存使用率监控
(1- (node_memory_MemAvailable_bytes{nodename="node2"})/node_memory_MemTotal_bytes{nodename="node2"} ) * 100
或者
(node_memory_MemTotal_bytes{nodename="node2"} - node_memory_MemAvailable_bytes{nodename="node2"})/node_memory_MemTotal_bytes{nodename="node2"} * 100
如果将Buffers和Cached也作为可用内存,则内存使用率计算公式如下:
(node_memory_MemTotal_bytes{nodename="node2"} - (node_memory_MemFree_bytes{nodename="node2"} + node_memory_Buffers_bytes{nodename="node2"} + node_memory_Cached_bytes{nodename="node2"}))/node_memory_MemTotal_bytes{nodename="node2"} * 100
上述公式的标签名用nodename来替换了instance,因为在prometheus中配置时,instance和job都按缺省取默认值。
3、磁盘分区使用率监控
(1- (node_filesystem_avail_bytes{nodename="monitor01",mountpoint="/"} / node_filesystem_size_bytes{nodename="monitor01",mountpoint="/"})) * 100
4、磁盘使用预测
predict_linear()函数,根据前一个时间段的值来预测未来某个时间点数据的走势。
predict_linear(node_filesystem_free_bytes{device="rootfs",nodename=~"node2",mountpoint="/"}[1d],24*3600) /(1024*1024*1024)
上面这个表达式含义是根据近1天的磁盘空闲情况,预测在明天的这个时间磁盘还空闲多少。
node2通过下面命令,临时创建文件,模拟磁盘增长
dd if=/dev/zero of=/disktest bs=1024 count=2097152
6、CPU饱和度监控
CPU饱和度通常是按系统的平均负载来衡量,如观察主机CPU数量(通常按逻辑CPU来算)在一段时间内平均运行的队列长度,当平均负载小于vCPU数量则认为是正常的,若负载长时间超出CPU的数量则认为CPU饱和。
我们先来看看如何查看主机的物理CPU个数、每个物理CPU的核数、每个物理CPU有多少个逻辑CPU(购买云主机时的vcpu数或叫线程数)。
通过过滤"physical id"查看物理CPU数
cat /proc/cpuinfo |grep "physical id" | uniq | wc -l
通过过滤"cpu cores"查看每个物理CPU有多个核数
cat /proc/cpuinfo | grep "cpu cores" | uniq
通过过滤"siblings"查看每个物理CPU下有多少个逻辑CPU数
cat /proc/cpuinfo | grep "siblings" |uniq
或者通过过滤"processor"查看所有物理cpu下的逻辑cpu个数
cat /proc/cpuinfo | grep "processor" | wc -l
CPU饱和度监控
avg(node_load1{nodename="node2"}) by (nodename)/count(node_cpu_seconds_total{nodename="node2",mode="system"}) by (nodename)
或者以下这种写法
avg(node_load1{nodename="node2"})/count(node_cpu_seconds_total{nodename="node2",mode="system"})
7、内存饱和度
可以用下面这两个指标来评估内存饱和度。
node_vmstat_pswpin:系统每秒从swap读到内存的字节数,读取的是/proc/vmstat下的pswpin(si),单位是KB/s 。
node_vmstat_pswpout:系统每秒从内存写到swap字节数,读取的是/proc/vmstat下的pswpout(so),单位是KB/s。
内存饱和度计算,个人理解是上面2个指标之和大于0时表示已使用到交换分区,内存达到饱和?但如果交换分区未启用该如何计算饱和度?
8、磁盘IO使用率
avg(irate(node_disk_io_time_seconds_total{nodename="node2"}[1m])) by(nodename) * 100
9、网卡接收/发送流量监控
irate(node_network_receive_bytes_total{nodename=~'node2',device=~"ens33"}[5m])*8 irate(node_network_transmit_bytes_total{nodename=~'node2',device=~"ens33"}[5m])*8
increase()函数,获取区间向量中的第一个和最后一个样本并返回其增长量。如果除以[区间]时间(秒)就可以获取该时间内的平均增长率与rate函数用途相同(注意是rate()不是irate),如下两个图所示。
总结:在使用Prometheus来监控各种系统指标时,要熟悉并记住对应的metric name以及该metric name对应是何种数据类型,然后就是熟悉PromQL的各种函数使用。系统资源饱和度是对使用率的一个补充,能让管理者做出有关系统的最佳决策。