天天看點

幾個優化 Cacti 監控服務性能的技巧

這幾天一直在深入研究 Cacti 的配置,我發現 Cacti 的功能真的很強大,而且大部分的配置和調試工作隻需要在圖形化的界面上做操作即可。由于公司的 Cacti 監控伺服器上配置的監控端越來越多,是以有些監控端出現圖形不連續的現象,調高 Cacti 的 log 等級,我在 cacti.log 檔案中發現如下的警告資訊:

05/25/2011 10:55:39 AM – SPINE: Poller[0] Host[46] TH[1] DS[862] WARNING: SNMP timeout detected [500 ms], ignoring host ’10.10.2.91′

05/25/2011 10:55:38 AM – SPINE: Poller[0] Host[46] TH[1] DS[862] WARNING: SNMP timeout detected [500 ms], ignoring host ’10.10.2.91′

Cacti 官方手冊中給出的解釋如下:

For “reasonable” timeouts, this may be related to a snmpbulkwalk issue. To change this, see Settings, Poller and lower the value for The Maximum SNMP OID’s Per SNMP Get Request. Start at a value of 2 and increase it again, if the poller starts working. (1 or less disables snmpbulkwalk) Some agent’s don’t have the horsepower to deliver that many OID’s at a time. Therefore, we can reduce the number for those older/underpowered devices.

我在 Device 配置界面下,将“Maximum OID’s Per Get Request”值設定為最小值“1”,該問題解決了。但是過了一段時間圖像又開始斷斷續續的,而且生成的 rrd 檔案中的數值都是 NaN,在監控伺服器端的指令行下執行 snmpwalk 指令,發現螢幕輸出跑了一些資訊後停下來顯示 Timeout: No Response from 10.10.2.91,這是由于網絡狀況不太好,是以導緻 Cacti 服務沒有完全獲得監控端的 SNMP 資訊就 Timeout 了。為了證明我的猜測,我在之前的運作的 snmpwalk 指令中加入“-t 120”選項,結果 snmpwalk 獲得了完整的監控端 SNMP 資訊。是以我在 Device 配置界面下設定“SNMP Timeout”值為 20000,問題徹底解決了,同時我把“Maximum OID’s Per Get Request”值又重新調整為預設值“10”。這樣可以減少 Cacti 監控伺服器通路監控端的 SNMP 服務的次數進而提高性能。如果你的網絡狀況很好的情況下,你可以進一步的調高“Maximum OID’s Per Get Request”值。

Cacti 服務自帶的輪詢腳本(cmd.php)性能低下,如果監控點多的話,平均5分鐘腳本有可能執行不完,經常導緻圖形斷斷續續,是以我推薦大家采用 spine,它的效率要高于 cmd.php 腳本。由于Cacti 服務需要寫 rrd 檔案記錄監控資訊,是以在監控點多的情況下,會經常性遇到 Disk I/O 的性能瓶頸。是以對 Cacti 監控伺服器進行一定的性能優化配置十分有必要。下面我來介紹幾個性能優化技巧:

1.  Settings 中修改“poller type”為 Spine,修改 Spine Specific Execution Parameters 裡的 Maximum Threads per Process 為監控伺服器 cpu 個數的2倍。我在實際的操作中将該值從預設值“1”修改為“16”,但是 Poller 的運作時間反倒增加了,再修改為“8”,情況好一些,是以大家可以自己随意改寫該數值,然後在 cacti.log 檔案中查詢 Poller 輪詢運作時間的變化,然後确定最優的方案。如果在 cacti.log 檔案中出現如下警告,請按照警告資訊在 Cacti 監控伺服器端修改相應檔案的操作權限。

05/25/2011 09:00:02 AM – SPINE: Poller[0] WARNING: Spine NOT running asroot. This is required if using ICMP. Please run “chmod +s;chown root:root spine” to resolve.

2. 給 Cacti 的 MySQL資料庫中的表建立索引。預設的 cacti.sql 裡一個索引都沒有,具體操作如下:

[root@pubservicedb rra]# mysql -uroot

mysql> use cacti;

Database changed

mysql> CREATE INDEX `data_template_data_id` ON `data_input_data` (`data_template_data_id`);

Query OK, 7498 rows affected (0.09 sec)

Records: 7498 Duplicates: 0 Warnings: 0

mysql> CREATE INDEX `host_id_snmp_query_id_snmp_index` ON data_local (`host_id`,`snmp_query_id`,`snmp_index`);

Query OK, 333 rows affected (0.04 sec)

Records: 333 Duplicates: 0 Warnings: 0

mysql> CREATE INDEX `local_data_id_data_source_name` ON data_template_rrd (`local_data_id`,`data_source_name`);

Query OK, 742 rows affected (0.05 sec)

Records: 742 Duplicates: 0 Warnings: 0

mysql> CREATE INDEX `graph_template_id_local_graph_id` ON graph_templates_item (`graph_template_id`,`local_graph_id`);

Query OK, 2887 rows affected (0.08 sec)

Records: 2887 Duplicates: 0 Warnings: 0

mysql> CREATE INDEX `local_graph_template_item_id` ON graph_templates_item (`local_graph_template_item_id`);

Query OK, 2887 rows affected (0.07 sec)

mysql> CREATE INDEX `host_id_snmp_query_id_snmp_index` ON host_snmp_cache (`host_id`,`snmp_query_id`,`snmp_index`);

Query OK, 1012 rows affected (0.09 sec)

Records: 1012 Duplicates: 0 Warnings: 0

mysql> CREATE INDEX `local_data_id_rrd_path` ON poller_item (`local_data_id`,`rrd_path`);

Query OK, 416 rows affected (0.04 sec)

Records: 416 Duplicates: 0 Warnings: 0

mysql> CREATE INDEX `host_id_rrd_next_step` ON poller_item (`host_id`,`rrd_next_step`);

Query OK, 416 rows affected (0.05 sec)

mysql> CREATE INDEX host_id_snmp_query_id ON host_snmp_cache (host_id,snmp_query_id);

Query OK, 1012 rows affected (0.07 sec)

mysql> CREATE INDEX host_id_snmp_port ON poller_item (host_id,snmp_port);

mysql> CREATE INDEX data_source_path ON data_template_data (data_source_path);

Query OK, 414 rows affected (0.04 sec)

Records: 414 Duplicates: 0 Warnings: 0

mysql>

3. 重構 rra 目錄結構,按照 device 劃分 rra 目錄結構。Settings 裡的 Paths 頁籤中勾選 “Structured RRA Path (/host_id/local_data_id.rrd)”,如果不成功,請在指令行下執行如下操作: