Link Search Menu Expand Document

Table of contents

  1. 背景
  2. 腳本及應用
    1. 腳本
    2. 結果
    3. crontab應用

背景

  • 因為工作站平行運作後,使用者的執行序增加成數百個、CPU使用量便是一長串結果,需要加總才能知道確切的資源分配情形。用簡單的top(htop), ps似乎不能達成。詢問chatGPT結果如下:

Q 前述各個方法,如何得知哪個使用者總共用了多少CPU?

A 要得知哪個使用者總共用了多少CPU,您可以使用以下方法: 使用ps與awk命令:運行下面的命令,它會計算每個使用者的總CPU使用率並列出結果。

ps -eo user,%cpu --sort=-%cpu | awk '{arr[$1]+=$2;} END {for (i in arr) {print i,arr[i]}}'

這個命令將會列出每個使用者的名稱以及他們所使用的總CPU百分比。 使用top與awk命令:運行下面的命令,它會顯示每個使用者的總CPU使用率。

top -b -n 1 | awk 'NR>7 {arr[$2]+=$9;} END {for (i in arr) {print i,arr[i]}}'

這個命令與之前提到的相同,使用top命令獲取每個進程的CPU使用率,並使用awk計算每個使用者的總CPU使用率。 無論使用哪種方法,它們都可以顯示每個使用者的總CPU使用率,這有助於您了解不同使用者在系統中的資源消耗情況。請注意,某些命令可能需要使用root權限或sudo來查看所有使用者的資訊。

腳本及應用

腳本

  • 將時間列在前述結果的前面。
    • 為讓格式統一,選用資料庫形式,每時間、每使用者一行。
    • 這需要先將前述結果分開成2個array
  • 因array長度不一定,用累計迴圈型態來列印結果
c=(); u=()
for j in $(ps -eo user,%cpu --sort=-%cpu | awk '{arr[$1]+=$2;} END {for (i in arr) {print i,arr[i]}}'|grep -v ' 0'|awk '{print $2}');do c=( ${c[@]} $j);done
for j in $(ps -eo user,%cpu --sort=-%cpu | awk '{arr[$1]+=$2;} END {for (i in arr) {print i,arr[i]}}'|grep -v ' 0'|awk '{print $1}');do u=( ${u[@]} $j);done
for ((i=0;i<${#u[@]};i+=1));do echo $(date) ${u[$i]} ${c[$i]};done

結果

kuang@dev2 /home/GFS
$ ./list_cpu.cs
Wed Jul 26 09:29:32 CST 2023 kuang 4.1
Wed Jul 26 09:29:32 CST 2023 mssql 1.5
Wed Jul 26 09:29:32 CST 2023 root 5.1

crontab應用

  • 在程式執行的同時,另行監控CPU的使用率,了解是否有其他使用者與其使用情形,以檢討資源利用的有效性。
  • 使用crontab控制每5分鐘詢問一次,並將每次統計結果附掛在檔案之後備查。
#WRF forecasting from gfs and CWBWRF results
30 17 * * * /home/GFS/fcst_devp.cs >& /home/GFS/fcst_devp.out
*/5 17-23 * * * rm /home/GFS/list_cpu.out;/home/GFS/list_cpu.cs >> /home/GFS/list_cpu.out