zabbix優化指南

原文地址:zabbix優化指南作者:polygun2000

  1. 本文是我綜合了參考資料中的一大堆東西捏在一起的,單純是翻譯整理了一下,另外配了一些圖,其他基本沒有什麼原創內容。


    1.如何度量Zabbix性能

     

    通過Zabbix的NVPS(每秒處理數值數)來衡量其性能。

    在Zabbix的dashboard上有一個錯略的估值。

     

    [轉載]zabbix優化指南

    在4核CPU,6GB內存,RAID10(帶有寫入緩存)這樣的配置條件下,Zabbix可以處理每分鐘1M個數值,大約每秒15000個。

     

    2.性能低下的可見症兆

  2. zabbix隊列中有太多被延遲的item: Administration-> Queue

  3. zabbix繪圖中經常性出現斷檔,一些item沒有數據

  4. 帶有nodata()函數的觸發器出現false

  5. 前端頁面無響應

  6.  

    3.哪些因素造成Zabbix性能低下

     

    因素

    數據庫大小

    巨大

    適應內存大小

    觸發器表達式的複雜程度

    Min(),max(),avg()

    Last(),nodata()

    數據收集方法

    輪訊(SNMP,無代理,Passive代理)

    Trapping(active代理)

    數據類型

    文本,字符串

    數值

    前端用戶數量

     

    主機數量也是影響性能的主要因素

    [轉載]zabbix優化指南
     

    4.瞭解Zabbix工作狀態

     

    獲得zabbix內部狀態

    zabbix[wcache,values,all]

    zabbix[queue,1m]  ----延遲超過1分鐘的item

    [轉載]zabbix優化指南

    獲得zabbix內部組件工作狀態(該組件處於BUSY狀態的時間百分比)

    zabbix[process,type,mode,state]

    其中可用的參數爲:

    type: trapper,discoverer,escalator,alerter,etc

    mode: avg,count,min,max

    state: busy,idel

     [轉載]zabbix優化指南

    [轉載]zabbix優化指南

    5.Zabbix調優大的原則性建議

  7. 確保zabbix內部組件性能處於被監控狀態(調優的基礎!)

  8. 使用硬件性能足夠好的服務器

  9. 不同角色分開,使用各自獨立的服務器

  10. 使用分佈式部署

  11. 調整MySQL性能

  12. 調整Zabbix自身配置

  13.  

    6.Zabbix數據庫調優

    a.使用專用數據服務器,配置應該較高

    給一個參考配置,可以處理NVPS爲3000

    Dell PowerEdge R610

    CPU:Intel Xeon L5520 2.27GHz (16 cores)

    Memory: 24GB RAM

    Disks:6x SAS 10k 配置 RAID10

     

    b.每個table一個文件,修改my.cnf

    innodb_file_per_table=1

     

    c.使用percona替代MySQL

     

    d.使用分區表,關閉Houerkeeper

    關閉Houserkeeper,zabbix_server.conf

    DisableHousekeeper=1

     

    [轉載]zabbix優化指南

    step1.準備相關表

    ALTERTABLE `acknowledges` DROP PRIMARY KEY, ADD KEY `acknowledgedid`(`acknowledgeid`);

    ALTERTABLE `alerts` DROP PRIMARY KEY, ADD KEY `alertid`(`alertid`);

    ALTERTABLE `auditlog` DROP PRIMARY KEY, ADD KEY `auditid`(`auditid`);

    ALTERTABLE `events` DROP PRIMARY KEY, ADD KEY `eventid`(`eventid`);

    ALTERTABLE `service_alarms` DROP PRIMARY KEY, ADD KEY `servicealarmid`(`servicealarmid`);

    ALTERTABLE `history_log` DROP PRIMARY KEY, ADD PRIMARY KEY(`itemid`,`id`,`clock`);

    ALTERTABLE `history_log` DROP KEY `history_log_2`;

    ALTERTABLE `history_text` DROP PRIMARY KEY, ADD PRIMARY KEY(`itemid`,`id`,`clock`);

    ALTERTABLE `history_text` DROP KEY `history_text_2`;

     

    step2.設置每月的分區

    以下步驟請在第一步的所有表中重複,下例是爲events表創建2011-5到2011-12之間的月度分區。

     

    ALTERTABLE `events` PARTITION BY RANGE( clock ) (

    PARTITION p201105 VALUES LESS THAN(UNIX_TIMESTAMP("2011-06-01 00:00:00")),

    PARTITION p201106 VALUES LESS THAN(UNIX_TIMESTAMP("2011-07-01 00:00:00")),

    PARTITION p201107 VALUES LESS THAN(UNIX_TIMESTAMP("2011-08-01 00:00:00")),

    PARTITION p201108 VALUES LESS THAN(UNIX_TIMESTAMP("2011-09-01 00:00:00")),

    PARTITION p201109 VALUES LESS THAN(UNIX_TIMESTAMP("2011-10-01 00:00:00")),

    PARTITION p201110 VALUES LESS THAN(UNIX_TIMESTAMP("2011-11-01 00:00:00")),

    PARTITION p201111 VALUES LESS THAN(UNIX_TIMESTAMP("2011-12-01 00:00:00")),

    PARTITION p201112 VALUES LESS THAN(UNIX_TIMESTAMP("2012-01-01 00:00:00"))

    );

     

    step3.設置每日的分區

    以下步驟請在第一步的所有表中重複,下例是爲history_uint表創建5.155.22之間的每日分區。

     

    ALTERTABLE `history_uint` PARTITION BY RANGE( clock ) (

    PARTITION p20110515 VALUES LESS THAN(UNIX_TIMESTAMP("2011-05-16 00:00:00")),

    PARTITION p20110516 VALUES LESS THAN(UNIX_TIMESTAMP("2011-05-17 00:00:00")),

    PARTITION p20110517 VALUES LESS THAN(UNIX_TIMESTAMP("2011-05-18 00:00:00")),

    PARTITION p20110518 VALUES LESS THAN(UNIX_TIMESTAMP("2011-05-19 00:00:00")),

    PARTITION p20110519 VALUES LESS THAN(UNIX_TIMESTAMP("2011-05-20 00:00:00")),

    PARTITION p20110520 VALUES LESS THAN(UNIX_TIMESTAMP("2011-05-21 00:00:00")),

    PARTITION p20110521 VALUES LESS THAN(UNIX_TIMESTAMP("2011-05-22 00:00:00")),

    PARTITION p20110522 VALUES LESS THAN(UNIX_TIMESTAMP("2011-05-23 00:00:00"))

    );

     

    手動維護分區:

    增加新分區

    ALTERTABLE `history_uint` ADD PARTITION (

    PARTITION p20110523 VALUES LESS THAN(UNIX_TIMESTAMP("2011-05-24 00:00:00"))

    );

    刪除分區(使用Housekeepeing)

    ALTERTABLE `history_uint` DROP PARTITION p20110515;

     

    step4.自動每日分區

    確認已經在step3的時候爲history表正確創建了分區。

    以下腳本自動drop和創建每日分區,默認只保留最近3天,如果你需要更多天的,請修改

    @mindays 這個變量。

     

    不要忘記將這條命令加入到你的cron中!

    mysql-B -h localhost -u zabbix -pPASSWORD zabbix -e "CALLcreate_zabbix_partitions();"

     

    自動創建分區的腳本:

    https://github.com/xsbr/zabbixzone/blob/master/zabbix-mysql-autopartitioning.sql

     

     

    DELIMITER //

    DROP PROCEDURE IF EXISTS`zabbix`.`create_zabbix_partitions` //

    CREATE PROCEDURE`zabbix`.`create_zabbix_partitions` ()

    BEGIN

    CALLzabbix.create_next_partitions("zabbix","history");

    CALLzabbix.create_next_partitions("zabbix","history_log");

    CALLzabbix.create_next_partitions("zabbix","history_str");

    CALLzabbix.create_next_partitions("zabbix","history_text");

    CALLzabbix.create_next_partitions("zabbix","history_uint");

    CALLzabbix.drop_old_partitions("zabbix","history");

    CALLzabbix.drop_old_partitions("zabbix","history_log");

    CALLzabbix.drop_old_partitions("zabbix","history_str");

    CALLzabbix.drop_old_partitions("zabbix","history_text");

    CALLzabbix.drop_old_partitions("zabbix","history_uint");

    END //

    DROP PROCEDURE IF EXISTS`zabbix`.`create_next_partitions` //

    CREATE PROCEDURE`zabbix`.`create_next_partitions` (SCHEMANAME varchar(64),TABLENAME varchar(64))

    BEGIN

    DECLARE NEXTCLOCK timestamp;

    DECLARE PARTITIONNAMEvarchar(16);

    DECLARE CLOCK int;

    SET @totaldays = 7;

    SET @i = 1;

    createloop: LOOP

    SET NEXTCLOCK = DATE_ADD(NOW(),INTERVAL @iDAY);

    SET PARTITIONNAME = DATE_FORMAT(NEXTCLOCK, 'p%Y%m%d' );

    SET CLOCK =UNIX_TIMESTAMP(DATE_FORMAT(DATE_ADD( NEXTCLOCK ,INTERVAL 1DAY),'%Y-%m-%d 00:00:00'));

    CALL zabbix.create_partition( SCHEMANAME,TABLENAME, PARTITIONNAME, CLOCK );

    SET @i=@i+1;

    IF @i > @totaldaysTHEN

    LEAVE createloop;

    END IF;

    END LOOP;

    END //

    DROP PROCEDURE IF EXISTS`zabbix`.`drop_old_partitions` //

    CREATE PROCEDURE`zabbix`.`drop_old_partitions` (SCHEMANAME varchar(64), TABLENAMEvarchar(64))

    BEGIN

    DECLARE OLDCLOCK timestamp;

    DECLARE PARTITIONNAMEvarchar(16);

    DECLARE CLOCK int;

    SET @mindays = 3;

    SET @maxdays = @mindays+4;

    SET @i = @maxdays;

    droploop: LOOP

    SET OLDCLOCK = DATE_SUB(NOW(),INTERVAL @iDAY);

    SET PARTITIONNAME = DATE_FORMAT( OLDCLOCK,'p%Y%m%d' );

    CALL zabbix.drop_partition( SCHEMANAME,TABLENAME, PARTITIONNAME );

    SET @i=@i-1;

    IF @i <= @mindaysTHEN

    LEAVE droploop;

    END IF;

    END LOOP;

    END //

    DROP PROCEDURE IF EXISTS`zabbix`.`create_partition` //

    CREATE PROCEDURE`zabbix`.`create_partition` (SCHEMANAME varchar(64), TABLENAMEvarchar(64), PARTITIONNAME varchar(64), CLOCK int)

    BEGIN

    DECLARE RETROWS int;

    SELECT COUNT(1) INTO RETROWS

    FROM`information_schema`.`partitions`

    WHERE `table_schema` = SCHEMANAME AND`table_name` = TABLENAME AND `partition_name` =PARTITIONNAME;

     

    IF RETROWS = 0 THEN

    SELECT CONCAT( "create_partition(",SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" )AS msg;

    SET @sql = CONCAT( 'ALTER TABLE `',SCHEMANAME, '`.`', TABLENAME, '`',

    ' ADD PARTITION (PARTITION ',PARTITIONNAME, ' VALUES LESS THAN (', CLOCK, '));' );

    PREPARE STMT FROM @sql;

    EXECUTE STMT;

    DEALLOCATE PREPARE STMT;

    END IF;

    END //

    DROP PROCEDURE IF EXISTS`zabbix`.`drop_partition` //

    CREATE PROCEDURE `zabbix`.`drop_partition`(SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAMEvarchar(64))

    BEGIN

    DECLARE RETROWS int;

    SELECT COUNT(1) INTO RETROWS

    FROM`information_schema`.`partitions`

    WHERE `table_schema` = SCHEMANAME AND`table_name` = TABLENAME AND `partition_name` =PARTITIONNAME;

     

    IF RETROWS = 1 THEN

    SELECT CONCAT( "drop_partition(",SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ")" ) ASmsg;

    SET @sql = CONCAT( 'ALTER TABLE `',SCHEMANAME, '`.`', TABLENAME, '`',

    ' DROP PARTITION ', PARTITIONNAME, ';');

    PREPARE STMT FROM @sql;

    EXECUTE STMT;

    DEALLOCATE PREPARE STMT;

    END IF;

    END //

    DELIMITER ;

     

    e.使用tmpfs存儲臨時文件

    mkdir /tmp/mysqltmp

    修改/etc/fstab:

    tmfs /tmp/mysqltmp tmpfsrw,uid=mysql,gid=mysql,size=1G,nr_inodes=10k,mode=0700 0 0

    修改my.cnf

    tmpdir=/tmp/mysqltmp

     

    f.設置正確的buffer pool

    設置Innodb可用多少內存,建議設置成物理內存的70%~80%

    修改my.cnf

    innodb_buffer_pool_size=14G

     

    設置innodb使用O_DIRECT,這樣buffer_pool中的數據就不會與系統緩存中的重複。

    innodb_flush_method=O_DIRECT

     

    以下給一個示例my.cnf,物理內存大小爲24G:

    [轉載]zabbix優化指南

     

    g.設置合適的log大小

    zabbix數據庫屬於寫入較多的數據庫,因此設置大一點可以避免MySQL持續將log文件flush到表中。

    不過有一個副作用,就是啓動和關閉數據庫會變慢一點。

    修改my.cnf

    innodb_log_file_size=64M

     

    h.打開慢查詢日誌

    修改my.cnf

    log_slow_queries=/var/log/mysql.slow.log

     

    i.設置thread_cache_size

    這個值似乎會影響show global status輸出中Threads_created perConnection的hit rate

    當設置成4的時候,有3228483 Connections和5840 Threads_created,hitrate達到了99.2%

    Threads_created這個數值應該越小越好。

     

    j.其他MySQL文檔建議的參數調整

    query_cache_limit=1M

    query_cache_size=128M

    tmp_table_size=256M

    max_heap_table_size=256M

    table_cache=256

    max_connections = 300

    innodb_flush_log_at_trx_commit=2

    join_buffer_size=256k

    read_buffer_size=256k

    read_rnd_buffer_size=256k

     

    7.調整zabbix工作進程數量,zabbix_server.conf

    StartPollers=90

    StartPingers=10

    StartPollersUnreacheable=80

    StartIPMIPollers=10

    StartTrappers=20

    StartDBSyncers=8

    LogSlowQueries=1000

     

    參考文檔:

    http://www.slideshare.net/xsbr/alexei-vladishev-zabbixperformancetuning

    http://zabbixzone.com/zabbix/mysql-performance-tips-for-zabbix/

    http://zabbixzone.com/zabbix/partitioning-tables/

    http://linux-knowledgebase.com/en/Tip_of_the_day/March/Performance_Tuning_for_Zabbix

    http://sysadminnotebook.blogspot.jp/2011/08/performance-tuning-mysql-for-zabbix.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章