《前情提要》
最近在某些設備裡看到許多重複的 apt udpate / yum check-update process 導致 CPU Loading 整個拉高,感覺是重複的 Jobs 導致這個情況發生 … 所以又要開始 Debug 了。
29794 ? Ss 32:14 /usr/bin/python /usr/bin/yum check-update
29884 ? Ss 31:16 /usr/bin/python /usr/bin/yum check-update
29987 ? Ss 32:15 /usr/bin/python /usr/bin/yum check-update
30141 ? Ss 31:31 /usr/bin/python /usr/bin/yum check-update
30185 ? Rs 47809:58 /usr/bin/python /usr/bin/yum check-update
30505 ? Ss 31:39 /usr/bin/python /usr/bin/yum -d 0 -e 0 -y install nfs-utils
30547 ? Ss 31:32 /usr/bin/python /usr/bin/yum check-update
31338 ? Ss 31:57 /usr/bin/python /usr/bin/yum check-update
31339 ? Ss 31:55 /usr/bin/python /usr/bin/yum check-update
31509 ? Ss 32:09 /usr/bin/python /usr/bin/yum check-update
31696 ? Ss 32:13 /usr/bin/python /usr/bin/yum check-update
31740 ? Ss 32:01 /usr/bin/python /usr/bin/yum check-update
31836 ? Ss 31:19 /usr/bin/python /usr/bin/yum check-update
31875 ? Ss 32:22 /usr/bin/python /usr/bin/yum check-update
31937 ? Ss 32:06 /usr/bin/python /usr/bin/yum check-update
32003 ? Ss 31:52 /usr/bin/python /usr/bin/yum check-update
32109 ? Ss 32:08 /usr/bin/python /usr/bin/yum check-update
查了一下發現是 Puppet 定期跑 Sync 產生出來的 process,仔細用 debug mode 查看確定每次 Puppet 都跑會 yum check-update (Ubuntu 則是 apt update)
# puppet agent debug
$ puppet agent -t --debug
找了一下 Google 找到「Why does puppet check the status of packages on every run, even if the package database hasn’t been modified since the last run?」講到 Puppet 每次同步會去 check packages …
其原因是在使用 package 時指定了 ensure => ‘latest’,因為 Puppet 要隨時讓 package 在最新的狀態,所以每次都會去 update repository 以確認是否有新版本。
package { ensure => ‘latest’ } 是很昂貴的效能成本
由於在我的環境有非常多的 Node,而且一個 Node 每 10 分鐘會同步一次,雖然僅僅是一個 yum check-update 的動作,但是對於整個系統來講會是很大的負擔,像是:
- Puppet 同步時間拉長 (連線到 Internel 的時間)
- 如果到 internel 要透過 proxy,必須再考量 proxy 的 loading
理論上跑 yum check-update 是不會有問題,但是如果遇到當下 proxy 有問題,或是 check 太久,就有可能產生 process 疊加的情況 …