V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
imherer
V2EX  ›  程序员

如何采集(监控)服务器上一个或多个进程的 CPU 内存占用等数据

  •  
  •   imherer · 16 小时 58 分钟前 · 2267 次点击

    现在一台服务器上可能会部署多个服务(不到 10 个的样子,是不同的服务,服务名不一样),如何采集这些进程的 CPU 、内存占用等数据呢

    目前想到的是写一个程序去读 top 命令的结果,但是假如我有 10 个服务的话,我得同时执行 10 条 top 命令,不知道 top 命令本身性能怎么样,会不会对服务器负载造成影响

    大佬们有现成的方案吗?

    45 条回复    2024-12-25 22:00:53 +08:00
    yanxin1111
        1
    yanxin1111  
       16 小时 58 分钟前
    prometheus?
    imherer
        2
    imherer  
    OP
       16 小时 56 分钟前
    @yanxin1111 这是拿到数据后的事了,现在的问题是这个数据怎么拿到
    hafuhafu
        3
    hafuhafu  
       16 小时 52 分钟前   ❤️ 2
    All in one 可视化、监控、告警中心 n9e: https://github.com/ccfos/nightingale
    配套的开箱即用的采集器 categraf: https://github.com/flashcatcloud/categraf
    采集进程信息: categraf 中的 procstat 采集插件已经实现了,https://flashcat.cloud/docs/content/flashcat-monitor/categraf/plugin/procstat/,改成需要的配置就行。
    FarmerChillax
        4
    FarmerChillax  
       16 小时 48 分钟前
    @imherer 我理解 #1 说的 prometheus 是指完整的的 prometheus 监控体系/生态。这确实是目前监控告警的主流
    imherer
        5
    imherer  
    OP
       16 小时 46 分钟前
    @FarmerChillax 我知道,只要拿到数据,用 prometheus+grafana 等一系列监控起来就行了。 可能是我标题写的不对,其实我更多的是想问怎么拿到这个数据
    imherer
        6
    imherer  
    OP
       16 小时 46 分钟前
    @hafuhafu 好的,谢谢,我看看
    yanxin1111
        7
    yanxin1111  
       16 小时 45 分钟前
    @imherer prometheus+grafana 这个可以自己配置要监控哪个服务的
    qoo2019
        8
    qoo2019  
       16 小时 44 分钟前
    @imherer 有一大票 Prometheus Exporter 直接就采集了
    imherer
        9
    imherer  
    OP
       16 小时 42 分钟前
    @qoo2019 我看 Exporter 都是针对现有的公共服务吧,类似 mysql 啊这种,自己的服务好像没有吧,得自己写 Exporter 吧
    imherer
        10
    imherer  
    OP
       16 小时 40 分钟前   ❤️ 1
    @yanxin1111 #7 我知道,我的意思是现在怎么拿到某个服务它对应的指标数据。你在 grafana 里配置要监控哪个服务的前提是得拿到这个服务对应的这些指标数据
    qoo2019
        11
    qoo2019  
       16 小时 30 分钟前
    @imherer 你看的是什么野鸡文档,了解下 Node Exporter ?
    dejavuwind
        12
    dejavuwind  
       16 小时 27 分钟前
    elastic 有个 metricbeat 配合 es 使用
    还有楼上提到的 node exporter 配合 Prometheus grafana 使用
    yuandj
        13
    yuandj  
       16 小时 26 分钟前
    类似这样吗?

    <img src="">
    easing
        14
    easing  
       16 小时 25 分钟前
    Prometheus 的 node exporter 没看过么
    i8086
        15
    i8086  
       16 小时 23 分钟前
    superchijinpeng
        16
    superchijinpeng  
       16 小时 22 分钟前
    imherer
        17
    imherer  
    OP
       16 小时 20 分钟前
    @yuandj 对的
    imherer
        18
    imherer  
    OP
       16 小时 17 分钟前
    @easing node exporter 能采集用户自己的服务的数据吗?
    imherer
        19
    imherer  
    OP
       16 小时 16 分钟前
    @i8086
    @superchijinpeng 感谢,这个 exporter 貌似可行,我看看
    shiyuu
        20
    shiyuu  
       16 小时 14 分钟前   ❤️ 1
    用 prometheus 就行。
    官方的这么多 exporter 组件可以使用,都去了解一下没坏处
    需要采集的节点装 exporter 组件组件就行,用得最多的是 node_exporter ,已经内置采集了系统的很多信息。
    你想自定义采集,那就要自己写脚本,比如采集执行某个指令的结果,参考
    https://github.com/prometheus/node_exporter#textfile-collector
    其实用 gpt 来帮你写就行
    采集的结果都会入库 prometheus ,再用 grafana 展示出来就行

    prometheus
    alertmanager
    blackbox_exporter
    consul_exporter
    graphite_exporter
    memcached_exporter
    mysqld_exporter
    node_exporter
    promlens
    pushgateway
    statsd_exporter
    yuandj
        21
    yuandj  
       16 小时 10 分钟前
    @imherer

    1. 先安装部署 Prometheus 和 Grafana
    2. 在需要监控的节点上安装 Node Exporter ,并启动服务
    3. 在 prometheus.yml 配置中,添加对应的监控配置,例子如下:
    ```
    ### 其他配置 ###
    xxx

    # ========== 机器性能监控(基于 Node Exporter ,监控模板 ID:16098 ) ===========
    - job_name: 'base' # JobName 在面板中可选择不同的 Job 分组查看监控
    static_configs:
    - targets: ['xx.xx.xx.xx:9100']
    labels:
    #instance: '此处填写面板中要展示 IP 的名称,如果不配,面板中会使用默认的 ip:port'
    nodename: '节点名称 1'
    - targets: ['xx.xx.xx.xx:9100']
    labels:
    nodename: '节点名称 2'
    ```
    4. 在 Grafana 添加 Prometheus 源
    5. 导入 Grafana 面板;这是我用的面板
    > https://grafana.com/grafana/dashboards/16098-node-exporter-dashboard-20240520-job/

    如果遇到卡点,可以留下你的联系方式交流一下
    imherer
        22
    imherer  
    OP
       16 小时 6 分钟前
    @yuandj #21 非常感谢,仔细看了下你这是针对单个机器的指标对吧。那可能不太符合我的需求,我想要的是单个机器上的某些服务
    ala2008
        23
    ala2008  
       16 小时 2 分钟前
    我们微服务 java 用了 jar 包,应该也可以用探针的方式吧
    yuan1028
        24
    yuan1028  
       15 小时 54 分钟前
    docker 部署吗?可以看看 https://github.com/google/cadvisor
    COW
        25
    COW  
       15 小时 49 分钟前 via Android
    不想太啰嗦了,这样说你就明白了。节点监控用 node exporter ,进程监控用 process exporter ,容器监控基本都是去集成 k8s 了。
    imherer
        26
    imherer  
    OP
       15 小时 47 分钟前
    @COW 嗯,目前在尝试 process-exporter
    imherer
        27
    imherer  
    OP
       15 小时 46 分钟前
    @yuan1028 嗯,这个也在用
    realityone
        28
    realityone  
       15 小时 46 分钟前
    newrelic 免费版
    cassidy0134
        29
    cassidy0134  
       15 小时 45 分钟前
    atop ,默认每十分钟拿一次机器上进程占用情况。
    cassidy0134
        30
    cassidy0134  
       15 小时 45 分钟前
    或者,用 docker compose 部署这十个服务。然后 docker top 看 usage
    263
        31
    263  
       15 小时 39 分钟前
    process-exporter 正则匹配

    ```
    process_names:
    - name: "{{.Comm}}:{{.Matches.ServerId}}"
    comm:
    - gmserver
    cmdline:
    - -C/data/code/(?P<ServerId>[0-9]+)/server.cfg

    - name: "{{.Comm}}:{{.Matches.ServerId}}"
    comm:
    - terrace
    cmdline:
    - -D/data/terrace/terrace_(?P<ServerId>[0-9]+)

    - name: "charge:{{.Comm}}:{{.Matches.ServerId}}"
    comm:
    - u3d-server
    cmdline:
    - -c(?P<ServerId>[0-9]+)

    - name: "ctrl:{{.Comm}}:{{.Matches.ServerId}}"
    comm:
    - u3d-server
    cmdline:
    - -w(?P<ServerId>[0-9]+)
    ```
    Zss77
        32
    Zss77  
       15 小时 38 分钟前
    首先想到的是 nmon ,是不是有些原始了……
    mayli
        33
    mayli  
       15 小时 7 分钟前
    传统的方法是 collectd
    billzhuang
        34
    billzhuang  
       14 小时 59 分钟前
    看 OP 这个问题问的这么豪放和对一楼的狂妄,
    我觉的 datadog 更适合 OP 。
    djasdjds
        35
    djasdjds  
       12 小时 38 分钟前
    @qoo2019 #11 node exporter 采集指定不了自己服务的信息,只是系统的 cpu 、men ,我刚做过,自己写采集器才行
    imherer
        36
    imherer  
    OP
       12 小时 11 分钟前
    @qoo2019 #11 自己服务的指标 Node Exporter 咋采集? textfile-collector 吗?那还不是要自己写采集脚本啊
    Immunize
        37
    Immunize  
       12 小时 6 分钟前
    top 没啥开销,核心就是去 /proc 目录下遍历下 PID ,采集两次间隔进程 CPU 执行时间的差值,算下占物理时间的间隔。不用脚本糊的话,很多语言都有第三方库可以干这种事,用顺手的就行,或者用 all in one 的东西。
    ShunYea
        38
    ShunYea  
       12 小时 5 分钟前
    哪吒监控?
    imherer
        39
    imherer  
    OP
       12 小时 2 分钟前
    @Immunize 嗯,最开始用了 gopsutil 这个库,后来改成 process-exporter ,感觉还可以,基本上满足需求
    jonzhao
        40
    jonzhao  
       12 小时 0 分钟前
    @Zss77 好多年没听过 nmon 了.... IBM P595 用过好久 :)
    dbak
        41
    dbak  
       10 小时 40 分钟前
    这个?
    theniupa
        42
    theniupa  
       8 小时 31 分钟前
    nmon
    git00ll
        43
    git00ll  
       8 小时 8 分钟前
    prometheus 是机器级别的吧, 进程级别的没看到过有 exporter
    hugowangnz
        44
    hugowangnz  
       6 小时 42 分钟前
    push gateway 可以主动发送数据到 Prometheus
    treexie
        45
    treexie  
       4 小时 42 分钟前
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1110 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 90ms · UTC 18:43 · PVG 02:43 · LAX 10:43 · JFK 13:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.