Jmeter/LR+Prometheus+Grafana+Sysstat構建性能監控系統
1:前言
1.1:Jmeter/LR能滿足性能測試嗎?
- Jmeter/LR肯定是可以滿足一般的互聯網企業的性能測試需求的
- Jmeter/LR能滿足性能測試需求 但是未必同時也是優秀的監控工具
- 我們知道Jmeter也可以用來監控一些服務器的資源 但是這個數據很粗糙 只能看到一些最基本的情況或者Fail Pass的情況 看不到更深層次的數據,既然沒有這些數據 我們怎麼去分析性能瓶頸,怎麼取針對性地優化?
- 綜上我們在做性能測試的時候同時引入Prometheus+Grafana+Sysstat這些系統來收集數據 配合這些數據可以快速定位待瓶頸 開發纔可以跟快速地定位問題
1.2:性能測試爲什麼要引入Prometheus+Grafana+Sysstat這樣的監控系統
- Prometheus+Grafana一般被用於監控線上環境的一套組合系統,它可以監控到跟深層面 不僅僅是監控一些服務器資源這麼簡單
- Prometheus相對一些其他的監控工具 它的精度更高 更底層,採集數據的準確率那是槓桿地
- Sysstat一般被用來監控服務器硬件資源情況 在性能結合它的使用可以幫助我們快速分析性能瓶頸 方便開發做針對性的優化
- 綜上 在性能測試時使用這套系統的目的就是提供儘可能詳近的數據 方便相關人員分析數據 發現瓶頸 針對優化
- 關於Jmeter或者LoadRunner怎麼去做性能測試 這個就不描述了
2:環境的安裝
2.1:prometheus-Server端和node_exporter的安裝
2.1.1:設置時區
- timedatectl set-timezone Asia/Shanghai
- contab -e 添加命令:* * * * * ntpdate -u cn.pool.ntp.org
- 重啓命令:service crond restart
2.1.2:Prometheus-Server端的安裝
- 下載prometheus-xxxx.linux-amd64.tar.gz
- 解壓 tar -zxvf prometheus-xxxx.linux-amd64.tar.gz
- 進入prometheus文件夾
- 後臺啓動:setsid ./prometheus 或者setsid ./prometheus --config.file=“prometheus.yml”
- prometheus-Server端默認啓動在9090端口
2.1.3:node_exporter的安裝
- 下載node_exporter的tar包
- 解壓
- 進入目錄
- 後臺運行:setsid ./node_exporter
2.1.4:添加node_exporter到prometheus-Server
- 進入prometheus目錄 打開prometheus.yml文件 添加如下內容
- job_name: 'node_exporter'
static_configs:
- targets:
- 'xx.xx.xx.xx:9100'
- 重啓prometheus
1:ps -ef|grep prometheus
2: kill -9 PID - 注意:安裝prometheus-Server的機器不用再安裝node_exporter 只需用在node機器上安裝node_exporter 然後添加到prometheus-Server的prometheus.yml文件中即可
2.1:Grafana的安裝與配置
2.1.1:Grafana的安裝
- 下載網站https://grafana.com/grafana/download
- Cnetos安裝
1:wget https://dl.grafana.com/oss/release/grafana-6.3.2-1.x86_64.rpm
2:sudo yum localinstall grafana-6.3.2-1.x86_64.rpm
3:啓動server :systemctl start grafana-server
2.1.2:Grafana的基本配置
- Add data source–>Prometheus–>Settings中設置Name、URL 然後save and Test沒報錯即可
- Add data source–>Prometheus–>Dashboards中導入必須的3個dashboards
2.2:Sysstat的安裝與使用
2.2.1:Sysstat的安裝與配置
- yum list sysstat 查看sysstat是否已被安裝
- yum install -y sysstat
- 進入/etc/cron.d/目錄下 打開sysstat文件 修改爲每分鐘運行一次收集數據
- 重啓sysstat:systemctl restart sysstat
- 生成的sa文件會默認保存在 /var/log/sa/路徑下
1:sa文件爲每分鐘生成的數據
2: sar位每天生成的summary文件
2.2.2:Sysstat的基本使用(excel文檔上傳到了github上 項目地址:https://github.com/AnndyTsai/prometheus-sysstat)
2.2.2.1:Sysstat的監控-CPU監控
- 查看excel sysstat.xls
2.2.2.2:Sysstat的監控-內存監控
- 查看excel sysstat.xls
2.2.2.3:Sysstat的監控-IO監控
- 查看excel sysstat.xls
2.2.2.4:Sysstat的監控-NetWork監控
- 查看excel sysstat.xls
3:prometheus的使用
- prometheus的使用建立在prometheus與node_exporter均配置正常的情況下
3.1:監控公式的使用
3.1.1:CPU使用率的計算
3.1.1.1:在計算CPU的使用率我們需要知道下列知識
- 1:CPU狀態有8總 常見的是用戶態和內核態 IO等待態以及idle狀態
- 2:單位時間的CPU使用率計算:(內核態時間+用戶態時間+其他5種狀態時間)/單位時間x100%
- 3:注意上面分子是沒有包含idle狀態的時間的
3.1.1.2:現在我們如何使用prometheus的公式計算一分鐘內的CPU使用率呢?
- 監控cpu每分鐘的idle率公式如下
sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance)
- 截圖如下:
- 監控cpu每分鐘的總的用戶使用率公式如下
(1-((sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)) / (sum(increase(node_cpu_seconds_total[1m])) by (instance))))*100
- 截圖如下:
-
基於上述我們舉一反三 獲取其他CPU狀態的使用率
1:獲取用戶態每分鐘的CPU使用率
(sum(increase(node_cpu_seconds_total{mode="user"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance))*100
2:獲取內核每分鐘的CPU使用率
(sum(increase(node_cpu_seconds_total{mode="system"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance))*100
3:獲取IO等待態每分鐘的CPU使用率
(sum(increase(node_cpu_seconds_total{mode="iowait"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance))*100
4:Prometheus結合Grafana的配置
4.1:Grafana添加Prometheus
- Add data source–>Prometheus–>Settings中設置Name、URL 然後save and Test沒報錯即可
- Add data source–>Prometheus–>Dashboards中導入必須的3個dashboards
- 具體的設置請查考下列截圖
4.2:Grafana新添加dashboard
-
新建DashBoard
-
新建DashBoard
-
新建DashBoard查詢的設置
-
新建DashBoard修改title和描述
-
新建DashBoard視圖的設置
-
保存
-
在剛剛新建的DashBoard上添加新的監控選項
5:Prometheus結合Grafana的使用
5.1:CPU的監控
-
針對CPU的監控 主要由以下三部分 具體Grafana的設置請參考4
- 監控cpu每分鐘的總的用戶使用率公式如下
(1-((sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)) / (sum(increase(node_cpu_seconds_total[1m])) by (instance))))*100
- 獲取user態每分鐘的CPU使用率(主要是應用測試啓動太多 導致進程多 從而導致user態的CPU使用時間佔比較高)
(sum(increase(node_cpu_seconds_total{mode="iowait"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance))*100
- 獲取IO等待態每分鐘的CPU使用率(當磁盤IO比較高的時候會出現IO等待時間較長 導致IOWAIT狀態的CPU使用佔比較高)
(sum(increase(node_cpu_seconds_total{mode="iowait"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance))*100
5.2:Memory的監控
- 針對內存的監控 主要由剩餘的可用內存組成
1:剩餘內存的計算:剩餘可用內存=free+Buffers+Cached ()(1-((node_memory_Buffers_bytes + node_memory_Cached_bytes + node_memory_MemFree_bytes)/node_memory_MemTotal_bytes))*100
5.3:IO的監控
-
磁盤使用率
100 - (node_filesystem_free_bytes{mountpoint="/",fstype=~"ext4|xfs"} / node_filesystem_size_bytes{mountpoint="/",fstype=~"ext4|xfs"} * 100)
-
磁盤IO讀寫(1min數據讀寫的量 單位MB/S) 一般情況下IO高的情況下會導致CPU的IOWAIT升高
((rate(node_nfsd_disk_bytes_read_total[1m])+rate(node_nfsd_disk_bytes_written_total[1m]))/1024/1024) > 0
-
網絡IO傳輸的監控(網絡讀寫IO的速率 Mb/S)
rate(node_network_transmit_bytes_total[1m])/1024/1024
5.4:文件句柄的監控
-
文件句柄介紹
1:文件句柄:文件句柄即文件描述符,每當一個進程打開一個文件時(Linux任何資源都可以看做文件)系統會分配一個唯一的整數型文件描述符 用來標示進程使用的這個文件,PID即文件句柄 -
文件句柄使用率
(node_filefd_allocated/node_filefd_maximum)*100
6:Prometheus結合Grafana監控進程
6.1:process-exporter的安裝配置
-
下載process-exporter:https://github.com/ncabatoff/process-exporter/releases/download/v0.4.0/process-exporter-0.4.0.linux-amd64.tar.gz
-
創建 process-name.yaml 文件
-
添加內容(具體怎麼添加 參考https://www.cnblogs.com/danny-djy/p/11149818.html)
-
啓動process-exporter:setsid ./process-exporter -config.path=process-name.yaml -web.listen-address=":8540" (啓動在8540端口)
-
添加下列到Prometheus配置文件中prometheus.yml文件中 然後重啓Prometheus
- job_name: 'process_exporter' static_configs: - targets: - 'IP:8540'
6.2:process-exporter的使用
- 進程的所有信息幾乎都可以監控 這個就不再介紹了 baidu
7:結束語
- Jmeter/LR能完成對業務層的性能監控 但是結合Prometheus和sysstat可以完成對系統層面 硬件層面的監控
- Prometheus和sysstat能提供更底層的數據 讓分析人員有數據可依
- Prometheus還能監控很多數據 socket TCP http https的數據 只要是Linux能提供的數據Prometheus都能監控