Linux

伺服器負載低時如何執行作業?

  • April 17, 2010

我有一個執行磁碟快照的命令(在 EC2 上,凍結 XFS 磁碟並執行 EBS 快照命令),該命令設置為作為 cron 作業定期執行。理想情況下,如果在計劃執行任務時磁碟被大量使用,我希望能夠將命令延遲一段時間。

我擔心使用 nice/ionice 可能不會產生適當的效果,因為我希望腳本在執行時以高優先級執行(即等待一段時間,然後快速完成)。

謝謝。

更新

這就是我最終的結果。它檢查 /proc/diskstats 並在目前 IO 活動達到 0 或我們超時時執行我的作業。當我查看我們的伺服器在生產中實際獲得什麼樣的 IO 活動時,我可能不得不對此進行調整:

#!/bin/bash

DEVICE=sdf

# we want to make a snapshot when IO in progresses reaches this:
LOW_THRESHOLD=0

TIMER=0
MAX_SEC_DELAY=120

# Get the number of IO operations in progress:
ioInProgress(){
   grep $DEVICE /proc/diskstats | awk '{print $12}'
}

# Wait for a good time to run snapshot, else timeout:

while [[ $TIMER -lt $MAX_SEC_DELAY && $(ioInProgress) -gt $LOW_THRESHOLD  ]]; do
   TIMER=`expr $TIMER + 1`
   sleep 0.5
done

# Recording delay required:
echo $TIMER
echo "Executing snapshot"
run-the-snapshot

我在這裡找到了一個 perl 腳本http://www.skolnick.org/cgi-bin/list.pl?file=serverload.pl

這應該做你需要的。

您可能可以使用解析正常執行時間的簡單 shell 腳本來實現這一點,並且只有在平均負載降低到某個值時才執行。

請注意,如果您的伺服器一直很忙,並且程序失控,那麼您的 cronjobs 將永遠不會執行!

如果您有記憶體,也許更好的主意是以最低的作業系統優先級執行您的 cron 作業,因此它們只會消耗備用資源。

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