Linux

Ubuntu 的 PHP 會話垃圾收集 cron 作業需要 25 分鐘才能執行,為什麼?

  • May 2, 2018

Ubuntu 設置了一個 cron 作業,用於查找和刪除舊的 PHP 會話:

# Look for and purge old sessions every 30 minutes
09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] \
  && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 \
  -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir \
  fuser -s {} 2> /dev/null \; -delete

我的問題是這個過程需要很長時間才能執行,並且有很多磁碟 IO。這是我的 CPU 使用率圖:

CPU 使用率圖

清理執行由青色尖峰表示。在此期間開始時,PHP 的清理作業被安排在預設的 09 和 39 分鐘時間。在 15:00,我從 cron 中刪除了 39 分鐘的時間,因此兩倍大小的清理工作執行頻率減半(您可以看到峰值的寬度和頻率的一半)。

以下是 IO 時間的對應圖表:

IO時間

和磁碟操作:

磁碟操作

在大約有 14,000 個活動會話的高峰期,可以看到清理執行了整整 25 分鐘,顯然在整個期間使用了 100% 的 CPU 一個核心以及似乎是 100% 的磁碟 IO。為什麼資源如此密集?一個ls會話目錄/var/lib/php5只需要幾分之一秒。那麼為什麼修剪舊會話需要整整 25 分鐘呢?我能做些什麼來加快速度嗎?

該設備的文件系統目前是 ext4,在 Ubuntu Precise 12.04 64 位上執行。

編輯:我懷疑負載是由於不尋常的過程“融合器”造成的(因為我希望一個簡單rm的場景比我看到的性能更快)。我將刪除 fuser 的使用,看看會發生什麼。

刪除fuser應該有幫助。該作業fuser為找到的每個會話文件執行一個命令(檢查目前是否打開了文件),這在具有 14k 個會話的繁忙系統上很容易花費幾分鐘。這是一個 Debian 錯誤(Ubuntu 基於 Debian)。

除了 memcached,您還可以嘗試將 tmpfs(記憶體中的文件系統)用於會話文件。與 memcached 一樣,這會使重新啟動時的會話無效(可以通過在關閉腳本中的某處備份此目錄並在啟動腳本中恢復來解決此問題),但設置起來會容易得多。但這無助於fuser解決問題。

引用自:https://serverfault.com/questions/422723