cron 和 jitter

19 一月, 2007 (00:21) | BSD 相關, 電腦與網路

或許 cron 該加個新參數…

每到晚上十二點,我都會看到某台機器被全台各地來的 FreeBSD cvsup 給 DDoS,我想,這很有可能是某個教學文件寫說最好每天都要更新 src / ports,然後給的範例設定在晚上 12 點吧 @_@ 我現在開的上限是 16 隻,經過長年觀察,每天連進來的那 16 隻幾乎都不一樣,很有可能是想連的人遠遠超過這個數字,然後大家先在門口廝殺一陣,運氣好的人才進得來… 之前也有試著開過 32 隻看看情況如何,結果是一樣塞得滿滿的,而且整台機器喘得快要死掉 XD

我想了很久,這要怎樣才能解套呢 ? 或許該來推廣一下 FreeBSD 對 cron 所做的 extension:-j / -J (jitter)。這個參數是告訴 cron 說每次要呼叫程式起來執行的時候,先亂數 sleep 一段時間,這樣可以減少系統在整點的時候所受到的 loading impact,例如說你可以設定 -j 60 (最多設到 60),表示 cron 在你指定的時間到了的時候,會先休息個 0-60 秒,再執行你所指定的程式。-j 對一般使用者有效,而 -J 則是對 superuser 有效。

但是這又面臨另一個問題,那就是 jitter 的設定是對全體有效的,也就是說你不能只對 cvsup 設定 random sleep,如果系統上有一些非得要準時執行的程式,那就麻煩了,所以我們得要想個別的方法… 首先,系統的 cron 不夠強,那我們換一個吧 ? 印象中 ports 裡面有我多年以前弄進去的一隻叫 fcron 的 (放在 ports/sysutils/fcron),它有提供一個 random 的功能。

不過,為了這麼一個小功能把整套 cron 換掉好像有點小題大作 ? 那我們硬幹一下,系統不提供,自己模擬一個出來好了:

@midnight (sleep `jot -r 1 0 3600` && cd /usr/src && make update) > /dev/null 2>&1

@midnight 也是 FreeBSD 的 cron extension,等同於 0 0 * * *jot -r 1 0 3600 是說在 0 到 3600 間取一個亂數,然後 sleep 那段時間,也就是選擇 不休息 或是 休息一小時 間的任一時間;事實上應該是用不到 3600 啦,如果你每天都 cvsup 的話,頂多花上 5 分鐘吧 ? 用 jot -r 1 0 600 應該就夠了。

不過這樣寫實在是蠻醜的,最好的解法當然就是系統的 cron 多一個可以對單一指令下 jitter 控制的 extension 啦… 有空的話來 hack 一下好了 :p 不過話說回來了,我在這邊嘴炮講這麼多也是沒用,畢竟 client 端是我無法控制的,只好祈禱這篇文章有夠多的人能看到啦 :Q

Technorati Tags: , ,

Comments

Pingback from Planeta FreeBSD » cron 和 jitter
Date: 2007/1/20, 5:16 下午

[...] Original post by ijliao [...]

Comment from Anonymous
Date: 2007/1/21, 2:13 下午

光是看過大神某文件的人就不知道有多少了…那些人應該都是凌晨三點上去的? :P

Write a comment