問題敘述

應用程式不斷地進行 stat("/etc/localtime")

說明

htop 中按 s 可以啟動 strace 觀察處理程序進行系統呼叫的情形,但卻被滿滿的 stat("/etc/localtime") 淹沒。

Google 後找到這篇《How setting the TZ environment variable avoids thousands of system calls》,簡單翻譯/摘錄如下:

當初次呼叫 localtime(3) 時,glibc 會從環境變數 TZ/etc/localtime 讀取時區設定;後續呼叫 localtime(3) 則只須檢查 TZ/etc/localtime 是否有變動。所以當 TZ 不存在時,每次呼叫 localtime(3) 都需要透過 stat(2) 來確定 /etc/localtime 並未改變。

其提供的解法是:設定 TZ=:/etc/localtime。如此,只要 TZ 未改變,就不須再讀取 /etc/localtime

這個方法的缺點是,比較不適用於有可能跨時區移動的筆電,對於不會移動的桌電、伺服器等才適用。

由於我只是為了避免 strace 的輸出被淹沒,直接針對特定處理程序,透過:

$ gdb -p <pid>
(gdb) call putenv("TZ=:/etc/localtime")
(gdb) detach

強行修改該處理程序的環境變數即可。