Linux
伺服器負載低時如何執行作業?
我有一個執行磁碟快照的命令(在 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 作業,因此它們只會消耗備用資源。