Wednesday, February 20, 2008

一個穩定及高效的 Cacti Server

Cacti 大概許多網管都有使用過,她的優點是架構簡單(PHP,MySQL, SNMP)容易建置,而且提供功能正是網管的基本需求,所以幾乎已經成為網管必備的工具。

Cacti 就如一般網管系統,每五分鐘監控一次所有的系統,但隨著企業的網路不斷成長,需要監控的系統也不斷增加。Cacti 將會面臨 Process 過多, 記憶體不足, IO 過重等問題。如果在 cacti.log 看到 cacti 執行一次超過 300 秒,就表示你的系統已經超過負荷了。

以下將我一路慢慢摸索出來的心得分享給大家。

0. 選擇適當的作業系統
請用 CentOS 或 Red Hat Enterprise,不要使用 Fedora 或是 Redhat 9 之前的版本。Red Hat Enterprise 的 kernel 已經是最佳化了 ,非常適合當 Server 使用。我幫過一些人將 Fedora 或是 Redhat 轉換成 CentOS,他們都有明顯感受到校能的差異,尤其是在記憶體的使用上。

1. 使用 Spine (Cactid)
Spine 使用 C 來取代呼叫 cmd.php ,在效能上提升很多。官方網頁也寫說 ,如果執行 php poller.php 時間超過 300 秒,就需要使用 Spine 。使用方法很簡單,照著官方網頁作就可以了,不在此贅述。個人是覺得 cmd.php 的方法該廢掉了,目前存在的意義只是因為 php 讓 cacti 達成跨平台的特性。

2. filesystem 選擇
如果可以的話,切割一塊獨立的分割區掛載 cacti 。檔案格式 reiserfs 是比較好的選擇 比 ext3 還要快許多。另外,我們還可以使用 noatime 的選項掛載 。加了 noatime 後,系統不更新上次檔案的存取時間,這個資訊對 cacti 這個系統不是很重要 ,也不會有其他不良影響,對於繁忙的檔案系統,將可以大大減少檔案系統的 IO。

ex.
/dev/sda3 /var/www/html/cacti ext3 defaults,noatime 0 0

3. 加大 php 的記憶體使用的上限
vi /etc/php.ini
memory_limit = 32M (預設是 8mb, 可以改大一點)

4. 定期 optimize cacti 資料庫
不知道從甚麼時候開始 ,我家的 cacti 的 poller_output 會不明原因的長大,差不多兩個禮拜後,就會大到資料越寫越慢,直到無法更新。一開始我是每隔一段時間手動 "Truncate poller_output table" 後,就會繼續正常運作。但實在是太麻煩了,現在改成用 crontab 去 optimize 整個 cacti 資料庫。如果不會寫 SQL 的人,用 phpMyAdmin 執行 optimize 時,同時也會顯示執行 SQL 的語法,直接拿來用就好了。在設定 cron 請注意,請不要跟 cacti 同時執行,假設你的 cacti 執行一次要 4 分鐘,請在第四分鐘後再執行。

其實正常來說 poller_output 的資料只是暫存的,系統會自行清空。但很奇怪的是,MySQL 有時候並沒有馬上實體刪掉,而是註記成冗餘資料,依舊占據資料表的空間。可能是這種原因導致資料表越長越大,所以後來我改用 optimize 的原因。

國外有人也有遇到相關問題 不知他解了沒?
http://forums.cacti.net/about25515.html

除錯建議:
1. rebild poller cache 或是 truncate poller_output table, 不可以在 cacti 的 poller.php 運作時執行
2. 善用 cacti web 的 debug 功能,以方便一個一個排除問題。
3. 建立新的 device ,最好先用 snmpwalk 測試一遍,可以抓到資料再來設定也不遲。

ps. reiserfs 的作者面臨官司,後續版本前途不明啊。真可惜。

No comments:

Post a Comment