服务器架构研究室blog.linuxhonker.com
1,优化数据库schema,建立合理的索引
cacti默认的cacti.sql建立的数据库模型,竟然一个Index都没有建。每次执行poller.php的时候,主要的时间,都花费在数据库查询上。使用下面的sql语句,建立一系列索引,弥补默认的cacti.sql中缺乏index的缺点。可以有效的提高poller.php执行的效率,缩短更新RRD文件所需的时间
CREATE INDEX `data_template_data_id` ON `data_input_data` (`data_template_data_id`);
CREATE INDEX `host_id_snmp_query_id_snmp_index` ON data_local (`host_id`,`snmp_query_id`,`snmp_index`);
CREATE INDEX `local_data_id_data_source_name` ON data_template_rrd (`local_data_id`,`data_source_name`);
CREATE INDEX `graph_template_id_local_graph_id` ON graph_templates_item (`graph_template_id`,`local_graph_id`);
CREATE INDEX `local_graph_template_item_id` ON graph_templates_item (`local_graph_template_item_id`);
CREATE INDEX `host_id_snmp_query_id_snmp_index` ON host_snmp_cache (`host_id`,`snmp_query_id`,`snmp_index`);
CREATE INDEX `local_data_id_rrd_path` ON poller_item (`local_data_id`,`rrd_path`);
CREATE INDEX `host_id_rrd_next_step` ON poller_item (`host_id`,`rrd_next_step`);
CREATE INDEX host_id_snmp_query_id ON host_snmp_cache (host_id,snmp_query_id);
CREATE INDEX host_id_snmp_port ON poller_item (host_id,snmp_port);
CREATE INDEX data_source_path ON data_template_data (data_source_path);
show index from table; 查看索引
2, 重构rra文件的目录结构,为每个device建立单独的rra目录
首先在crontab里禁用poller.php,然后执行cacti_install_dir/cli目录下的 structure_rra_paths.php,
php structure_rra_paths.php –proceed
它会将所有的RRD文件按照device重新分配目录,并修改数据库中的RRD路径,成功执行后,再恢复poller.php的crontab就可以了。
按照上面3个步骤,710台服务器,24000个RRD文件,完成一次poller.php的时间,缩短到50 seconds。实现了最初的目的。
TODO:
在执行poller.php的时候, 监控服务器的load达到了3,通过vmstat查看,显示负载主要在I/O。在目前的情况,如果再出现瓶颈,可以考虑安装Boost插件来进一步提供性能。
cacti主要通过snmp来采集数据,可以引入collected等客户端,提供数据采集的可靠性。
3,使用spine替代默认的cmd.php来采集数据 见上一章
1、让Cacti使用Spine插件,并进行相关设置
关于spine插件的安装,这里就不讲了
访问:http://cacti_host_ipaddress/cacti
Settings -> Paths -> ”Spine Poller File Path” -> spine程序的位置
Settings -> Poller -> ”Poller Type” -> spine
2、进程调整
对于进程和线程的调整有利于缩短采集时间,可以进行大量的采集。在CU论坛上看有人说cacti能够同时采集1k服务,这样的性能没有测试过,但是有人测试过同时采集200台服务器的,占用的内容只有几百兆,cpu的利用率也很低,说明一台的普通的机器排除网络链路延时采集的性能是相当强悍的
Settings -> Poller -> ”Maximum Concurrent Poller Processes”(最大并发轮询器进程),修改该值
Settings -> Poller -> ”Maximum Threads per Process”(每进程最大线程数),修改该值
Settings -> Poller -> ”Number of PHP Script Servers”(PHP脚本服务程序数),修改该值
通过修改这三个参数,可以提高一部分的性能
3、增加php 的内存使用的上限值
# vi /etc/php.ini
memory_limit = 256M (预设是128MB,根据内存的使用情况,可以改大一点)
4、定期 optimize cacti 数据库
cacti 的 poller_output 会不明原因的长大,大到数据越写越慢,直到无法更新。每隔一段时间手动 “Truncate poller_output table” 后,就会继续正常运作;所以我们可以利用crontab定期清除数据
#vi /etc/cron.d/truncate_poller
0 0 * * 0 root /usr/local/mysql/bin/mysql –user=cacti –password=2010 cacti -e ‘truncate table poller_output;’
#chkconfig –level 3 crond on && service crond start
5、修改mysql的最大连接数
一般默认安装的时候没有调整最大连接数的话,当需要并发量的时候可以出图就会断断续续的
mysql> set GLOBAL max_connections=2000;
或者直接修改my.cnf配置文件,增加:max_connections = 2000;