都是trigger惹的祸

简介:
这几天遇到的一个case,简单记录下。

最近应用团队的zabbix系统(由于总总原因我们大数据部门使用自己的监控系统)出现了比较严重的性能问题,zabbix db服务器一直高负载,IO接近饱和(16 SAS raid5),从监控的数据来看,每秒的读次数高达2k/s,io util一直都是100%的。


wKioL1MIxMOAqf3sAAjvboX5X_Y115.jpg


实际是只监控了1012台服务器,103113个item,1k多的nvps,由于应用运维团队对zabbix不是特别熟悉,大家武断地认为zabbix的性能已经到达瓶颈了。但是根据之前的经验,这个数据其实远远没有到达zabbix的性能瓶颈,问过之前pptv的同事,他们的zabbix集群监控了5400多台机器,100多w的item,nvps在3200左右,db的io util也不过30%左右。


wKioL1MIxNjzZXW-AAOT9AJ8h30551.jpg

为了不影响监控加上公司比较财大气粗,就直接在db server上使用flash卡了。。但是加上flash卡之后,db的性能并没有变好转,io压力还是很高。


wKiom1MIxQ-hzuWzAAMh8gLaupM395.jpg


看来问题没有这么简单。于是和同事开始查找原因:

在db上开启general log来抓取实时的select信息,在zabbix item更新的时候会有如下操作:


wKiom1MIxSHS19R3AAbWSjVQoXY858.jpg

首先取出item的相关信息,然后通过update语句来更新这个item的信息,因为所有的select都在一个事务里,这样用了mysql-proxy也无读写分离。

另外发现不少的item更新会有 select x  from history_uint where itemid=xxx and clock<= now();的查询,通过explain 查看,虽然对history的相关表都做了分区,但是这条语句仍然扫描了大多数分区的数据,这就造成响应缓慢,同时因为需要扫描大量的partition,又会需要大量的io操作。


zabbix 04:25:55>explain partitions select value from history_uint where itemid=41597 and clock<=1390720637\G
          id: 1
 select_type: SIMPLE
       table: history_uint
  partitions: p20140112,p20140113,p20140114,p20140115,p20140116,p20140117,p20140118,p20140119,p20140120,p20140121,p20140122,p20140123,p20140124,p20140125,p20140126
        type: range
possible_keys: history_uint_1
         key: history_uint_1
   key_len: 12
         ref: NULL
        rows: 9687
       Extra: Using where
1 row in set (0.00 sec)


这个sql是由trigger触发的,在item每次更新操作完成后,都会通过这个sql查询trigger中设置的判断值。通过查询items表和hosts表找到这个item的trigger相关设置,发现语法中有last(#0)的情况:


wKiom1MIxXfy13pwAACzOF82gBY426.jpg

在trigger语法中,last(#x)表示最后几个,zabbix通过trigger的语法来拼出select的sql,但是这个版本的zabbix有bug,在解析这种trigger语法的时候会出问题,最后产生了没有查询范围的sql.

原因找到了,直接通过update functions表把#0的都变成0就可以了。
update functions set parameter='0' where parameter='#0';

小结:许多zabbix的性能问题可以由分析zabbix的db的general log和slow log来解决。在设置trigger时,需要设置一个有效地时间范围。


本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1362242,如需转载请自行联系原作者
相关文章
|
编解码 前端开发 JavaScript
深入探讨 PostCSS 的特点、优势以及在实际开发中的应用
PostCSS是一款用JavaScript实现的CSS处理工具,通过丰富的插件生态,支持代码优化、格式化、兼容性处理及性能提升,极大提升了前端开发效率和代码质量。它高度可定制,易于集成现有工作流,适用于大型项目和复杂设计需求。
208 3
|
数据采集 监控 大数据
不限量住宅IP代理指南2024版
住宅IP代理是一种特别的代理形式,它通过互联网服务提供商(ISP)池获取真实住宅用户的IP地址。在此背景下,住宅IP通常与特定的物理位置绑定,从而在网络上看起来像是真实用户。该服务为企业及个人执行数据密集型活动时提供了可靠的支持
不限量住宅IP代理指南2024版
PyAlgoTrade 0.20 中文文档(四)(5)
PyAlgoTrade 0.20 中文文档(四)
103 0
|
Java PHP
php-fpm的pool
通过使用不同的pool,你可以更好地优化和控制PHP应用程序的性能和资源使用,确保不同的应用程序在同一服务器上能够良好地隔离和运行。这对于多租户环境或需要处理多个不同类型的请求的服务器非常有用。
159 0
|
XML Java 数据格式
spring怎么去引用/注入集合/数组类型和 怎么通过 util 名称空间创建 list以及 怎么去通过级联属性赋值
spring怎么去引用/注入集合/数组类型和 怎么通过 util 名称空间创建 list以及 怎么去通过级联属性赋值
241 0
|
缓存 网络协议 算法
深入理解Linux网络——TCP协议三次握手和四次挥手详细流程
• 找到套接字:创建内核对象的时候,fd会跟file对象做通过fd_install关联起来,通过进程的fd_table就可以找到对应的file,而file的private指针就指向了socket对象,所以根据fd即可找到套接字 • 判断当前套接字的状态:只有SS_UNCONNECTED状态(刚创建的套接字就是该状态)才会继续,其他状态都会报错 1. 注意此处是socket的状态,而不是sock的状态 2. 会将socket状态更改为SS_CONNECTING • 更改sock状态为TCP_SYN_SENT
|
网络协议 NoSQL Unix
[√]Android NDK调试启动分析LLDB-SERVER
[√]Android NDK调试启动分析LLDB-SERVER
631 0
|
消息中间件 缓存 Java
Java Spring Boot 自动装配:简化配置和提高开发效率
Spring Boot 自动装配是 Spring Boot 提供的一种特性,它可以根据应用程序的依赖关系和配置信息,自动配置应用程序的各种组件和功能。这样,开发者可以将更多的精力放在业务逻辑的实现上,而不需要手动配置和管理各种组件。
|
NoSQL 算法 Java
弄懂Redis的儿子Redisson,只需这个15问题
在一个分布式系统中,由于涉及到多个实例同时对同一个资源加锁的问题,像传统的synchronized、ReentrantLock等单进程情况加锁的api就不再适用,需要使用分布式锁来保证多服务实例之间加锁的安全性。常见的分布式锁的实现方式有zookeeper和redis等。而由于redis分布式锁相对于比较简单,在实际的项目中,redis分布式锁被用于很多实际的业务场景中。 redis分布式锁的实现中又以Redisson比较出名,所以本文来着重看一下Redisson是如何实现分布式锁的,以及Redisson提供了哪些其它的功能。
|
数据采集 API Python
自制简易谷歌翻译器详解(附完整UI界面及代码文件)
自制简易谷歌翻译器详解(附完整UI界面及代码文件)
592 1