問題敘述
應用程式不斷地進行 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
強行修改該處理程序的環境變數即可。