日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标...

發布時間:2023/12/2 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自開始負責生產環境部署,中間遇到了若干線上環境內存以及CPU的問題。由于微服務以及容器的流行,現在已經可以很方便的使用 K8s + prometheus + grafana + alert 的方式進行監控,這足以覆蓋大部分場景。

最重要的事情已經交由最適合的組件去做,然而了解一些在裸機上的命令以及指標也是必不可少的:

  • 了解監控什么指標
  • 平時寫一些腳本也經常會 OOM 或者 CPU 使用率過高
  • 先以一張來自 linuxperf 的圖作為大綱于,我試著對一些指標進行整理,以備不時之需。

    htop/top

    htop 足以覆蓋大多數指標,詳細直接查看幫助即可。

  • sort: by mem/cpu/state. 根據進程狀態排序也至關重要,特別在 load average 過高的時候。根據內存以及CPU使用率排序用以定位高資源占用者。
  • filter
  • fields
  • process/ count
  • ...
  • CPU 基本信息

    在 linux 中一切皆文件,查看 /proc/cpuinfo 查看信息。另有衍生問題

    • 如何查看 CPU 個數
    • 如何查看 CPU model
    • 如何查看 CPU 主頻
    cat /proc/cpuinfo cat /proc/stat

    平均負載 (load average)

    使用 uptime 和 w 可打印出系統過去 1, 5, 15 分鐘內的平均負載。同時,你可以使用 sar -q 查看動態的平均負載。

    $ uptime19:28:49 up 290 days, 20:25, 1 user, load average: 2.39, 2.64, 1.55 $ w19:29:50 up 290 days, 20:26, 1 user, load average: 2.58, 2.63, 1.61 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 172.16.0.1 19:27 6.00s 0.05s 0.00s tmux a

    在 uptime 的 man 手冊中這么解釋平均負載

    System load averages is the average number of processes that are either in a runnable or uninterruptable state.

    翻譯過來就是指系統中處于可運行狀態和不可中斷狀態的平均進程數。

    對于 4 核的 CPU,如果平均負載高于 4 就代表負載過高

    動態平均負載

    $ sar -q 1 100 Linux 3.10.0-957.21.3.el7.x86_64 (shanyue) 10/21/19 _x86_64_ (2 CPU)16:55:52 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 16:55:53 0 464 0.07 0.11 0.13 0 16:55:54 0 464 0.06 0.10 0.13 0 16:55:55 0 464 0.06 0.10 0.13 0 16:55:56 0 464 0.06 0.10 0.13 0 16:55:57 0 464 0.06 0.10 0.13 0 16:55:57 0 464 0.06 0.10 0.13 0 Average: 0 464 0.06 0.10 0.13 0

    CPU 使用率

    可以直接使用 htop/top 命令查看 CPU 使用率,idle 的cpu時間也可以直接通過 top 顯示出來

    CPU 利用率 = 1 - cpu-idle-time / cpu-time

    $ top %Cpu(s): 7.4 us, 2.3 sy, 0.0 ni, 90.1 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
    • user: 用戶態,但不包括 nice
    • system: 內核態
    • nice: 低優先級用戶態,nice 值為 1-19 的 CPU 時間
    • idle (id)
    • iowait (wa)
    • irq (hi)
    • softirq (si)
    • steal (st)

    系統調用

    strace 查看系統調用

    • -p 指定pid
    • -c 統計各項系統調用被調用了多少次以及CPU時間
    # 用來看一個進程所用到的系統調用 # -p: 指定 7477 號進程 $ strace -p 7477# 用來查看某命令需要用到的系統調用 $ strace cat index.js# 關于系統調用的統計信息 $ strace -p 7477 -c

    內存

    free 用以查看系統內存。

    如果查看進程內存,使用 pidstat -r 或者 htop

    $ free -htotal used free shared buff/cache available Mem: 3.7G 682M 398M 2.1M 2.6G 2.7G Swap: 0B 0B 0B

    進程

    衍生問題

    • 如何根據命令名找到進程
    • 如何根據參數名找到進程
    • 進程狀態有哪些
    • 如何獲取進程狀態
    • 如何獲取進程的CPU占用率
    • 如何獲取進程的內存占用
    # 查看 122 PID 進程 $ ps 122# 根據命令名(command)找到 PID $ pgrep -a node 26464 node /code/node_modules/.bin/ts-node index.ts 30549 node server.js# 根據命令名以及參數找到 PID $ pgrep -af ts-node 26464 node /code/node_modules/.bin/ts-node index.ts# 查看 122 PID 進程的信息 $ cat /proc/122/status $ cat /proc/122/*# 打印父進程樹 # -s --show-parents: 顯示父進程 # -a --arguments: 顯示參數,如 echo hello 中 hello 為參數 $ pstree 122 -sap

    procfs

    http://man7.org/linux/man-p…

    進程的狀態

    • D uninterruptible sleep (usually IO)
    • R running or runnable (on run queue)
    • S interruptible sleep (waiting for an event to complete)
    • T stopped by job control signal
    • t stopped by debugger during the tracing
    • W paging (not valid since the 2.6.xx kernel)
    • X dead (should never be seen)
    • Z defunct ("zombie") process, terminated but not reaped by its parent

    使用 htop/top 可以查看所有進程的狀態信息,特別在幾種情況下常用

    • 查看過多的僵尸進程
    • 當平均負載過大時
    # 第二行可以統計所有進程的狀態信息 $ top ... Tasks: 214 total, 1 running, 210 sleeping, 0 stopped, 3 zombie ...

    進程內存

    ps -O rss 指定 rss 可以查看進程的內存,另外還有命令 top/htop 與 pidstat -r

    # 查看 2579 PID 的內存 # -O rss 代表附加 RSS 信息進行打印 $ ps -O rss 2579PID RSS S TTY TIME COMMAND

    實時查看進程內存

    pidstat -sr

    # 查看 23097 PID 的內存信息,每隔一秒打印一次 # -r: 查看進程的內存信息 # -s: 查看進程的 stack 信息 # -p: 指定 PID # 1: 每間隔 1s 打印一次 # 5: 共打印 5 組 $ pidstat -sr -p 23097 1 5 Linux 3.10.0-693.2.2.el7.x86_64 (shanyue) 07/18/19 _x86_64_ (2 CPU)18:56:07 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command 18:56:08 0 23097 0.00 0.00 366424 95996 2.47 136 80 node18:56:08 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command 18:56:09 0 23097 0.00 0.00 366424 95996 2.47 136 80 node18:56:09 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command 18:56:10 0 23097 0.00 0.00 366424 95996 2.47 136 80 node18:56:10 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command 18:56:11 0 23097 0.00 0.00 366424 95996 2.47 136 80 node18:56:11 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command 18:56:12 0 23097 0.00 0.00 366424 95996 2.47 136 80 nodeAverage: UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command Average: 0 23097 0.00 0.00 366424 95996 2.47 136 80 node

    頁表與缺頁異常

    pidstat -s 中 minflt 與 majflt 代表缺頁異常

    $ pidstat -s -p 23097 1 5 Linux 3.10.0-693.2.2.el7.x86_64 (shanyue) 07/18/19 _x86_64_ (2 CPU)18:56:07 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command 18:56:08 0 23097 0.00 0.00 366424 95996 2.47 136 80 node18:56:08 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command 18:56:09 0 23097 0.00 0.00 366424 95996 2.47 136 80 node

    標準輸出定位到文件中

    列出打開的文件

    lsof, list open files

    # 列出打開的文件 $ lsof COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,1 4096 2 / systemd 1 root rtd DIR 253,1 4096 2 /

    容器中 namespace PID -> global PID 映射

    換一個問題就是,如何找出 docker 容器中的 pid 在宿主機對應的 pid

    # 容器環境# 已知容器中該進程 PID 為 122 # 在容器中找到對應 PID 的信息,在 /proc/$pid/sched 中包含宿主機的信息 $ cat /proc/122/sched node (7477, #threads: 7) ... # 宿主機環境# 7477 就是對應的 global PID,在宿主機中可以找到 # -p 代表指定 PID # -f 代表打印更多信息 $ ps -fp 7477 UID PID PPID C STIME TTY TIME CMD root 7477 7161 0 Jul10 ? 00:00:38 node index.js

    global PID -> namespace PID 映射

    換一個問題就是, 已知宿主機的 PID,如何找出對應的容器

    常見的場景就是使用 top/htop 定位到占用內存/CPU過高的進程,此時需要定位到它所在的容器

    # 通過 docker inspect 查找到對應容器 $ docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}' | grep 22932# 通過 cgroupfs 找到對應容器 $ cat /etc/22932/cgroup

    幸運地是有人已經在 stackoverflow 上總結出來了

    • http://stackoverflow.com/questions/2…

    SWAP

    # 查找關于 $ vmstat -s

    inode

    # -i: 打印 inode number $ ls -lahi

    網絡吞吐量

    • 帶寬: 指網絡鏈路的最大傳輸速率
    • 吞吐量: 代表單位時間內成功傳輸的數據量,單位為 b/s (KB/s, MB/s)
    • PPS: pck/s (Packet Per Second),以網絡包為單位的傳輸速率
    # 查看網卡信息 $ ifconfig eth0$ sar -n DEV 1 | grep eth0 # IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 16:34:37 eth0 8.00 2.00 0.69 1.90 0.00 0.00 0.00 16:34:38 eth0 39.00 27.00 2.91 38.11 0.00 0.00 0.00 16:34:39 eth0 13.00 11.00 0.92 13.97 0.00 0.00 0.00 16:34:40 eth0 16.00 16.00 1.21 20.86 0.00 0.00 0.00 16:34:41 eth0 17.00 17.00 1.51 15.27 0.00 0.00 0.00 Average: eth0 18.60 14.60 1.45 18.02 0.00 0.00 0.00

    socket 狀態

    socket 信息

    推薦使用 ss,不過 netstat 仍需要掌握,在特定條件 (docker 中) 有可能沒有 ss 命令。

    # -t TCP # -a 所有狀態 # -n 顯示數字地址和端口號 # -p 顯示 pid $ netstat -tanp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.11:35283 0.0.0.0:* LISTEN - tcp 0 0 192.168.112.2:37344 172.18.0.1:6379 ESTABLISHED 78/node tcp 0 0 :::80 :::* LISTEN 78/node
    • Recv-Q 與 Send-Q 不為0時,表示網絡包堆積,需要注意

    協議信息

    # 展示對每個協議的統計信息 $ netstat -s# 展示對每個協議的統計信息 $ ss -s Total: 1468 (kernel 1480) TCP: 613 (estab 270, closed 315, orphaned 0, synrecv 0, timewait 41/0), ports 0Transport Total IP IPv6 * 1480 - - RAW 0 0 0 UDP 30 22 8 TCP 298 145 153 INET 328 167 161 FRAG 0 0 0# 也可以這樣統計 estab socket 的數量 $ netstat -tanp | grep ESTAB | wc -l

    TCP 連接數

    PostgresSQL 的最大連接數與當前連接數

    -- 最大連接數 show max_connections;-- 當前連接數 select count(*) from pg_stat_activity;

    mysql 的最大連接數與當前連接數

    -- 最大連接數 show variables like 'max_connections';-- 當前連接數 show full processlist;

    總結

    以上是生活随笔為你收集整理的c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。