建议采集下Linux服务器上内存占用Top的进程信息,在内存抖动的时候便于排查问题。
下面是一个python版的DEMO,待修改完善。 生产上建议使用golang来编写。
# -*- coding: utf-8 -*-
# 采集指标,并上报到pushgateway
import psutil
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway
# 获取所有进程信息
processes = psutil.process_iter(['pid', 'name', 'memory_percent','memory_info'])
# 创建一个字典来存储进程ID、名称和内存使用率
proc_info = [(proc.info['pid'], proc.info['name'], proc.info['memory_percent'], proc.info['memory_info']) for proc in processes]
# 过滤掉内存使用率为0的进程(通常表示无法获取准确信息)
proc_info = [proc for proc in proc_info if proc[2] != 0]
# 按照内存使用率降序排序
sorted_proc_info = sorted(proc_info, key=lambda x: x[2], reverse=True)
# 打印内存使用率最高的10个进程
data=[]
for proc in sorted_proc_info[:10]:
pid, name, memory_percent,memory_info = proc
print(f"PID: {pid}, Name: {name}, Memory Usage: {memory_percent}% , RSS_Mem: {memory_info._asdict()['rss']}")
res = {"pid": pid,"name":name,"mem_usage": memory_percent,"rss_mem": memory_info._asdict()['rss']}
data.append(res)
# Pushgateway的地址
pushgateway_url = 'http://localhost:9091'
# 创建CollectorRegistry实例
registry = CollectorRegistry()
# 创建Gauge类型的metrics
metrics = {
'mem_usage': Gauge('memory_usage', 'Percentage of usage', registry=registry, labelnames=['pid', 'name']),
'rss_mem': Gauge('rss_mem', 'Resident Set Size in bytes', registry=registry, labelnames=['pid', 'name']),
}
# 设置metrics的值
for item in data:
pid = item['pid']
name = item['name']
mem_usage = item['mem_usage']
rss_mem = item['rss_mem']
# 根据进程名选择正确的metrics
metrics['mem_usage'].labels(pid=pid, name=name).set(mem_usage)
metrics['rss_mem'].labels(pid=pid, name=name).set(rss_mem)
# 将metrics推送到Pushgateway
# TODO 这里的instance要改为获取主机的主机名或者IP地址
push_to_gateway(pushgateway_url, job='process_metrics', registry=registry,grouping_key={"instance": "devops-all-01"},)
print("Metrics successfully pushed to Pushgateway")
执行如下:
最终grafana的效果如下(建议根据instance绘图,在左上角配置个下拉列表):
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。