labunix's blog

labunixのラボUnix

debian bookwormにsystatをインストール、CPU温度をsyslogに書き込み

■debian bookwormにsystatをインストール、CPU温度をsyslogに書き込み
 sysstatで負荷状況を、lm-sensorsでCPU温度を取得する
 16コア、64GBメモリに負荷かけるだけでも大変なはずだけど、興味本位で見ておきたい

 debian busterにsysstatを導入する。
 https://labunix.hateblo.jp/entry/20200721/1595266993

 暇だったので、CPU/MEM/DISK I/OとNetworkエラーが無いかチェックするスクリプトを書いた。
 https://labunix.hateblo.jp/entry/20130429/1367241075

$ lsb_release -d
No LSB modules are available.
Description:	Debian GNU/Linux 12 (bookworm)

■sysstatのインストールと初期設定

$ sudo apt-get install -y sysstat

$ systemctl list-unit-files -t service | awk 'NR==1||/sysstat/'
UNIT FILE                                  STATE           PRESET
sysstat-collect.service                    static          -
sysstat-summary.service                    static          -
sysstat.service                            disabled        enabled

$ sudo systemctl status sysstat
○ sysstat.service - Resets System Activity Logs
     Loaded: loaded (/lib/systemd/system/sysstat.service; disabled; preset: enabled)
     Active: inactive (dead)
       Docs: man:sa1(8)
             man:sadc(8)
             man:sar(1)


$ sudo cp /etc/default/sysstat{,.org}
$ sudo sed -i -e 's%ENABLED="false"%ENABLED="true"%' /etc/default/sysstat
$ echo /etc/default/sysstat{,.org} | awk '{printf "%-63s %-63s\n",$1,$2}';sdiff -s /etc/default/sysstat{,.org}
/etc/default/sysstat                                            /etc/default/sysstat.org                                       
ENABLED="true"						      |	ENABLED="false"

■sysstatサービスの起動

$ sudo systemctl enable sysstat
Synchronizing state of sysstat.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable sysstat
Created symlink /etc/systemd/system/multi-user.target.wants/sysstat.service → /lib/systemd/system/sysstat.service.
Created symlink /etc/systemd/system/sysstat.service.wants/sysstat-collect.timer → /lib/systemd/system/sysstat-collect.timer.
Created symlink /etc/systemd/system/sysstat.service.wants/sysstat-summary.timer → /lib/systemd/system/sysstat-summary.timer.

■「sysstat-summary.timer」は昨日のサマリ用、「sysstat-collect.timer」が採取タイミングのファイル

$ grep "\/10" /lib/systemd/system/sysstat-collect.timer 
OnCalendar=*:00/10

$ sudo systemctl start sysstat

$ sudo systemctl status sysstat | awk -v host=$(hostname -s) '{gsub(host,"target-host",$0);print $0}'
● sysstat.service - Resets System Activity Logs
     Loaded: loaded (/lib/systemd/system/sysstat.service; enabled; preset: enabled)
     Active: active (exited) since Wed 2023-10-25 19:56:03 JST; 14min ago
       Docs: man:sa1(8)
             man:sadc(8)
             man:sar(1)
   Main PID: 11726 (code=exited, status=0/SUCCESS)
        CPU: 3ms

1025 19:56:03 target-host systemd[1]: Starting sysstat.service - Resets System Activity Logs...
1025 19:56:03 target-host systemd[1]: Finished sysstat.service - Resets System Activity Logs.

■今回はデフォルトの10分に一回のままとするが以下のcronは使われず、systemdの管理下にあるようだ

$ grep -B 1 '\/10' /etc/cron.d/sysstat
# Activity reports every 10 minutes everyday
5-55/10 * * * * root command -v debian-sa1 > /dev/null && debian-sa1 1 1

■システムの起動中に有効にするには、もう人手間要るようだ

$ sudo systemctl enable --now sysstat
Synchronizing state of sysstat.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable sysstat

$ grep -B 1 "\/10" /usr/lib/systemd/system/sysstat-collect.timer
[Timer]
OnCalendar=*:00/10

■ファイルに書くこまれるのを待つ
 ※システムの再起動を行っていないので「systemctl enable --now sysstat」するまで出力されなかった
 ※cronの末尾5分の10分ごとではなく「sysstat-collect.timer」の10分ごとの設定が効いている

$ d=$(date '+%d');watch -d -n 10 "env LANG=C sar -u -f /var/log/sysstat/sa$d" | sed -e 's/'$(hostname -s)'/tatget-hostname/g'
Every 10.0s: env LANG=C sar -u -f /var/log/sysstat/sa25                                                                tatget-hostname: Wed Oct 25 20:36:29 2023

Linux 6.1.0-13-amd64 (target-hostname)  10/25/23        _x86_64_        (16 CPU)

19:56:03     LINUX RESTART      (16 CPU)

20:11:21     LINUX RESTART      (16 CPU)

20:20:05        CPU     %user     %nice   %system   %iowait    %steal     %idle
20:30:01        all      0.97      0.00      0.52      0.01      0.00     98.50
Average:        all      0.97      0.00      0.52      0.01      0.00     98.50

■なんの負荷もかかっていないのに87度が本当だとすると困る。。。
 ※過去のintel CPUで、高負荷時にhigh 83°C ~ crit 99°Cのしきい値に対し、
  100°Cになるとシステムが落ちるという経験をしていたので。。。

$ env LANG=C sar -m TEMP 1 1 | sed -e 's/'$(hostname -s)'/target-hostname/g'
Linux 6.1.0-13-amd64 (target-hostname) 	10/25/23 	_x86_64_	(16 CPU)

20:54:40         TEMP      degC     %temp DEVICE
20:54:41            1     40.25      0.00 k10temp-pci-00c3
20:54:41            2     39.85     87.92 nvme-pci-0100
20:54:41            3     39.00      0.00 amdgpu-pci-0400

Average:         TEMP      degC     %temp DEVICE
Average:            1     40.25      0.00 k10temp-pci-00c3
Average:            2     39.85     87.92 nvme-pci-0100
Average:            3     39.00      0.00 amdgpu-pci-0400

■CPUはRyzen 7 5800U
 ミニPCとはいえ、平常時からそんなに温度が高いはずないし、触ってみても熱くはない

$ awk '/model name/{a[$0]+=1}END{for(n in a){print a[n],n}}' /proc/cpuinfo
16 model name	: AMD Ryzen 7 5800U with Radeon Graphics

$ apt-file search bin/sensors
lm-sensors: /usr/bin/sensors              
lm-sensors: /usr/bin/sensors-conf-convert
lm-sensors: /usr/sbin/sensors-detect

$ sudo apt-get install -y lm-sensors

■現在+39.9°Cで、high +82.8°C〜crit +84.8°C

$ sensors
k10temp-pci-00c3
Adapter: PCI adapter
Tctl:         +46.4°C  

nvme-pci-0100
Adapter: PCI adapter
Composite:    +39.9°C  (low  = -273.1°C, high = +82.8°C)
                       (crit = +84.8°C)

amdgpu-pci-0400
Adapter: PCI adapter
vddgfx:      643.00 mV 
vddnb:       774.00 mV 
edge:         +40.0°C  
PPT:           4.00 W  

■cronを使ってjson形式で、loggorからsyslogに書き込み

$ sudo apt-get install -y jq

$ sensors -j
{
   "k10temp-pci-00c3":{
      "Adapter": "PCI adapter",
      "Tctl":{
         "temp1_input": 43.000
      }
   },
   "nvme-pci-0100":{
      "Adapter": "PCI adapter",
      "Composite":{
         "temp1_input": 39.850,
         "temp1_max": 82.850,
         "temp1_min": -273.150,
         "temp1_crit": 84.850,
         "temp1_alarm": 0.000
      }
   },
   "amdgpu-pci-0400":{
      "Adapter": "PCI adapter",
      "vddgfx":{
         "in0_input": 0.768
      },
      "vddnb":{
         "in1_input": 0.774
      },
      "edge":{
         "temp1_input": 40.000
      },
      "PPT":{
         "power1_average": 4.000
      }
   }
}

■loggerを使って送信、syslogからjsonログを復元

$ sensors -j | jq -c | logger
$ sudo awk '/temp1_input/{gsub(".* labunix: ","",$0);print $0}' /var/log/syslog  | jq -r
{
  "k10temp-pci-00c3": {
    "Adapter": "PCI adapter",
    "Tctl": {
      "temp1_input": 41.375
    }
  },
  "nvme-pci-0100": {
    "Adapter": "PCI adapter",
    "Composite": {
      "temp1_input": 39.85,
      "temp1_max": 82.85,
      "temp1_min": -273.15,
      "temp1_crit": 84.85,
      "temp1_alarm": 0
    }
  },
  "amdgpu-pci-0400": {
    "Adapter": "PCI adapter",
    "vddgfx": {
      "in0_input": 1.3
    },
    "vddnb": {
      "in1_input": 0.774
    },
    "edge": {
      "temp1_input": 41
    },
    "PPT": {
      "power1_average": 21
    }
  }
}

■cronサービスの確認

$ sudo systemctl status cron.service 
● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; preset: enabled)
     Active: active (running) since Mon 2023-10-23 22:40:22 JST; 1 day 22h ago
       Docs: man:cron(8)
   Main PID: 709 (cron)
      Tasks: 1 (limit: 76349)
     Memory: 436.0K
        CPU: 738ms
     CGroup: /system.slice/cron.service
             └─709 /usr/sbin/cron -f

1025 20:35:01 debian-bookworm CRON[13227]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
1025 20:35:01 debian-bookworm CRON[13226]: pam_unix(cron:session): session closed for user root
1025 20:45:01 debian-bookworm CRON[13380]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
1025 20:45:01 debian-bookworm CRON[13381]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
1025 20:45:01 debian-bookworm CRON[13380]: pam_unix(cron:session): session closed for user root
1025 20:55:01 debian-bookworm CRON[13839]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
1025 20:55:01 debian-bookworm CRON[13839]: pam_unix(cron:session): session closed for user root
1025 21:05:01 debian-bookworm CRON[14049]: pam_unix(cron:session): session opened for user root(uid=0) by (uid=0)
1025 21:05:01 debian-bookworm CRON[14050]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
1025 21:05:01 debian-bookworm CRON[14049]: pam_unix(cron:session): session closed for user root

■実行ファイルのパスをチェックして

$ echo "sensors jq logger" | awk '{for(a=1;a<=NF;a++){print "whereis -b "$a}}' | sh
sensors: /usr/bin/sensors
jq: /usr/bin/jq
logger: /usr/bin/logger

■実行権限を付与したスクリプトを「/etc/cron.hourly/」に放り込めば、
 crontabがhorlyを呼び出す毎時17分にloggerからsyslogに書き込まれるようになる。

$ chmod +x mycputemp 
$ cat mycputemp 
#!/bin/bash

/usr/bin/sensors -j | /usr/bin/jq -c | /usr/bin/logger

$ sudo mv mycputemp /etc/cron.hourly/

$ grep hourly /etc/crontab 
17 *	* * *	root	cd / && run-parts --report /etc/cron.hourly

■余談:loggerからsyslogに書き込んだログは、journalにも書き込まれている

$ sudo env LANG=C journalctl -ea | awk '/temp1/&& !/TTY/{gsub(".*labunix\[[0-9]*\]: ","",$0);print $0}' | jq -r
{
  "k10temp-pci-00c3": {
    "Adapter": "PCI adapter",
    "Tctl": {
      "temp1_input": 41.375
    }
  },
  "nvme-pci-0100": {
    "Adapter": "PCI adapter",
    "Composite": {
      "temp1_input": 39.85,
      "temp1_max": 82.85,
      "temp1_min": -273.15,
      "temp1_crit": 84.85,
      "temp1_alarm": 0
    }
  },
  "amdgpu-pci-0400": {
    "Adapter": "PCI adapter",
    "vddgfx": {
      "in0_input": 1.3
    },
    "vddnb": {
      "in1_input": 0.774
    },
    "edge": {
      "temp1_input": 41
    },
    "PPT": {
      "power1_average": 21
    }
  }
}

■cronはrootで実行されたことになっていて、HH:17のログとなっている

$ sudo awk '/temp1_input/&&$3 ~ /root/{print $1}' /var/log/syslog
2023-10-25T22:17:01.953714+09:00