问题状态:

zabbix_agentd不能启动,系统CentOS 5.8 i386

原因分析:

这是因为内核对share memory的限制造成的。

用到如下命令ipcs [-m|l|a],sysctl [-a|p]

复制代码

 

[[email protected] ~]# ipcs -l

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 0
max total shared memory (kbytes) = 0

min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

------ Messages: Limits --------
max queues system wide = 16
max size of message (bytes) = 65536
default max size of queue (bytes) = 65536

复制代码

 

从上面可以看到max total shared memory和max seg size都是没有限制的。但是zabbix仍然不能allocate内存。

接下来查看目前的共享内存设置,

[[email protected] ~]# sysctl -a|grep shm
kernel.shmmni = 4096
kernel.shmall = 0
kernel.shmmax = 0

其中kernel.shmall代表总共能分配的共享内存,kernel.shmax代表单个段能allocate的内存(以字节为单位),这里都是0,所以肯定有问题。

然后查看/etc/sysctl.conf

kernel.shmmax = 68719476736
kernel.shmall = 4294967296

得到shmall为4G,shmax更大,为64G,因为是32位系统,所以设置shmall的时候不能超过32位系统能识别的最大内存,所以最多能设置为3G多,所以这个我改为

kernel.shmmax = 1294967296
kernel.shmall = 3294967296

然后执行sysctl -p生效,这时再查看如下。

[[email protected] ~]# sysctl -a|grep shm
kernel.shmmni = 4096
kernel.shmall = 3294967296
kernel.shmmax = 1294967296

的确生效了,然后启动zabbix_agentd成功,查看内存分配情况如下。

[[email protected] ~]# ipcs -m

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x7401840e 2916352 root 600 4 0
0x6c0180cf 3047425 zabbix 600 527272 6

 

其实不光zabbix,很多程序出现此错误也能使用该方法解决,就是因为内核对资源的限制问题。

 

随着线上zabbix系统运行的时间越长,zabbix的数据库也在逐渐增大,这时我们会发现,越到后面,备份数据库时间就花的越长.特别是上千台 机器的情况,然而在大数据量的备份过程中,经常会出现检测数据延迟,导致检测出错,产生不必要的误报.为了不产生误报,只能停止 zabbix_server服务,进行备份.如果恰巧在这段时间,线上的应用服务器出现了故障,将不能及时发现与处理故障.如何才能实现快速的备份 zabbix数据库,而且可以在不停止服务的情况下完成备份呢?
其实zabbix数据库里面最大的表,就是历史记录的表了, 这些表中的数据,全都存储着之前所检测到的历史数据.所以,现在就很清楚了,你可以选择清空这些表,这样做的话,所有客户端的历史检测数据,都会被清空, 空间自然就小了,如果你不想失去这些数据的话,那么也可以在备份数据库的时候,选择不备份这几张表.或是只备份这几张表的表结构,里面的数据不做备份.选 择哪一种,可以根据实际情况而定.
下面的操作是清空历史数据的表,主要就是以下这几张表,清空后,备份一下数据库,只要不到三分钟的时间,就可以搞定了…..

use zabbix;
truncate table history;
optimize table history;
truncate table history_str;
optimize table history_str;
truncate table history_uint;
optimize table history_uint;
truncate table trends;
optimize table trends;
truncate table trends_uint;
optimize table trends_uint;
truncate table events;
optimize table events;

Check_redis.pl  nagios 使用方法

Next for help and to see what parameters this plugin accepts do: 
./check_redis.pl –help 

命令

define command { 
command_name check_redis_new 
command_line $USER1$/check_redis.pl -H $HOSTADDRESS$ -p $ARG1$ -T $ARG2$ -M $_HOSTSYSTEM_MEMORY$ -m $ARG3$

# Arguments and thresholds are: 
# $ARG1 : 端口
# $ARG2 : 反馈时间区间
# $ARG3 : 内存利用率阀值

服务模板
define service { 
use prod-service 
hostgroups redishosts 
service_description Redis 
check_command check_redis_new!6379!”1,2″!”80,90″!

主机模板
define host { 
use prod-server 
host_name redis.mynetwork 
address redis.mynetwork 
alias Redis Stat Server 
hostgroups linux,redishosts 
_SYSTEM_MEMORY ‘8G’ 

Redis.pl有很多扩展监控,请看./check_redis.pl –help 

配置例子:

主机
define host {
       host_name                       Redis01-70.175
       alias                             Redis01-70.175
       address                            10.10.10.175
       contact_groups                admin
       check_command              check-host-alive
       _SYSTEM_MEMORY       ’64G’
       max_check_attempts        5
       notification_interval      10
       notification_period        24×7
       notification_options       d,u,r
       }

服务
define service {
        host_name                      Redis01-70.175
        use                                 abc
        service_description            check_redis 6379
        contact_groups                 admin
        check_command                  check_redis!6379!”1,2″!”80,90″!
        }

命令
define command {
command_name check_redis
command_line $USER1$/check_redis.pl -H $HOSTADDRESS$ -p $ARG1$ -T $ARG2$ -M $_HOSTSYSTEM_MEMORY$ -m $ARG3$
}

cacti有一个插件可以监控磁盘IO的(snmpdiskio),在网上找了一下,不太好下载。好不容易搞了下来,结果过程也挺痛苦的,要改一些东西,对cacti模板这一块儿不熟。简单记录一下怎么使用这个插件来监控linux的磁盘IO。

cacti 0.8.8b(目前为止是最新的)

linux (centos 6.4)

首先下载插件,下载完之后解压。

# # cd snmpdiskio-0.9.6/
# cp snmpdiskio /usr/local/bin/
# vi /var/www/html/cacti/resource/snmp_queries/partition.xml #添加以下内容

        Get SNMP Partitions
        Queries a host for a list of monitorable partitions
        .1.3.6.1.4.1.2021.13.15
        hdDescr:hdIndex
        numeric
        |chosen_order_field|
 
        
                
                        Index
                        walk
                        value
                        input
                        .1.3.6.1.4.1.2021.13.15.1.1.1
                
                
                        Description
                        walk
                        value
                        input
                        .1.3.6.1.4.1.2021.13.15.1.1.2
                
                
                        Bytes Written
                        walk
                        value
                        output
                        .1.3.6.1.4.1.2021.13.15.1.1.3
                
                
                        Bytes Read
                        walk
                        value
                        output
                        .1.3.6.1.4.1.2021.13.15.1.1.4
                
        

# chown cacti.cacti /var/www/html/cacti/resource/snmp_queries/partition.xml

然后修改一下snmpd.conf的配置,把以下内容添加到snmpd.conf的最后

# vi /etc/snmp/snmpd.conf
extend .1.3.6.1.4.1.2021.54 hdNum /bin/sh /usr/local/bin/snmpdiskio hdNum
extend .1.3.6.1.4.1.2021.55 hdIndex /bin/sh /usr/local/bin/snmpdiskio hdIndex
extend .1.3.6.1.4.1.2021.56 hdDescr /bin/sh /usr/local/bin/snmpdiskio hdDescr
extend .1.3.6.1.4.1.2021.57 hdInBlocks /bin/sh /usr/local/bin/snmpdiskio hdInBlocks
extend .1.3.6.1.4.1.2021.58 hdOutBlocks /bin/sh /usr/local/bin/snmpdiskio hdOutBlocks

然后重启一下snmp,并测试能否取到数据

# service snmpd restart
# # snmpwalk -v 2c -c mingdao localhost .1.3.6.1.4.1.2021.58
UCD-SNMP-MIB::ucdavis.58.1.0 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.58.2.1.2.11.104.100.79.117.116.66.108.111.99.107.115 = STRING: "/bin/sh"
UCD-SNMP-MIB::ucdavis.58.2.1.3.11.104.100.79.117.116.66.108.111.99.107.115 = STRING: "/usr/local/bin/snmpdiskio hdOutBlocks"
UCD-SNMP-MIB::ucdavis.58.2.1.4.11.104.100.79.117.116.66.108.111.99.107.115 = ""
UCD-SNMP-MIB::ucdavis.58.2.1.5.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 5
UCD-SNMP-MIB::ucdavis.58.2.1.6.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.58.2.1.7.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.58.2.1.20.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 4
UCD-SNMP-MIB::ucdavis.58.2.1.21.11.104.100.79.117.116.66.108.111.99.107.115 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.58.3.1.1.11.104.100.79.117.116.66.108.111.99.107.115 = STRING: "0"
UCD-SNMP-MIB::ucdavis.58.3.1.2.11.104.100.79.117.116.66.108.111.99.107.115 = STRING: "0

能获取到数据,再继续。

把压缩包里的两个文件以模板的形式导致到Cacti

cacti_data_query_snmp_disk_statistics.xml

cacti_graph_template_disk_io_bytessec.xml

把这两个导入就可以了。然后cacti添加监控的时候,使用snmp disk就行了。

上图因为我已经添加过两个盘了,所以出现的是灰色的。其它的不清楚是一些什么设备,因为是云主机,所以可能跟虚拟机有关系。这里我们只添加自己关心的设备就可以了。