关于MySQL-Proxy子进程异常退出BUG修复

关于 MySQL-Proxy 子进程异常退出的问题,我已经在之前的博文中提到过:

http://sofar.blog.51cto.com/353572/1398820

相关的错误信息如下图所示:

经查阅11号信号为SIGSEGV,表示进程执行了一个无效的内存引用或发生段错误,从而导致子进程异常退出。

我们知道 MySQL-Proxy 采用的是父子进程的模式,处理请求都是由子进程来完成的,而父进程只起到监控子进程的作用, 我们一般会在 MySQL-Proxy 的配置文件中添加“keepalive=true”参数,以确保在子进程异常退出时,由父进程自动将其拉起。

刚开始定位到以下两个源码文件:

src/chassis-unix-daemon.c

src/chassis-mainloop.c

在其中看到了对 SIGTERM/SIGINT/SIGHUP 三个信号的处理,于是也按照类似的方法添加了对 SIGSEGV 信号的处理(将其信号忽略掉),修改大致如下:

src/chassis-unix-daemon.c:

signal(SIGSEGV, chassis_unix_signal_forward);
......
signal(SIGSEGV, SIG_DFL);

src/chassis-mainloop.c:

struct event ev_sigterm, ev_sigint, ev_sigsegv;
......
signal_set(&ev_sigsegv, SIGSEGV, sigsegv_handler, NULL);
event_base_set(chas->event_base, &ev_sigsegv);
signal_add(&ev_sigsegv, NULL);
......
signal_del(&ev_sigsegv);

虽然不再报错,也能正常工作,但好景不长,5分钟左右就挂掉了。因为我们将 SIGSEGV 信号忽略掉了,子进程异常退出时,父进程收不到导致子进程异常退出的 SIGSEGV 信号,当然也就无法正常将其子进程拉起,所以此方法不能解决我们的问题。

既然以上方法不能解决我们的问题,于是就想到了通过开启 coredump 的方式来进行调试追踪,设置如下:

# ulimit -c unlimited

# echo "1" > /proc/sys/kernel/core_uses_pid

# mkdir -p /root/corefile

# echo "/root/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

重新编译 MySQL-Proxy(注意要加上“-g”参数):

# ./configure --prefix=/usr/local/mysql-proxy \

--with-lua=/usr/local/lua \

--with-mysql=/usr/local/mysql \

GLIB_CFLAGS="-I/usr/local/glib-2.32.4/include/glib-2.0" \

GLIB_LIBS="-L/usr/local/glib-2.32.4/lib/glib-2.0 -lglib-2.0" \

GMODULE_CFLAGS="-I/usr/local/glib-2.32.4/include" \

GMODULE_LIBS="-L/usr/local/glib-2.32.4/lib -lgmodule-2.0" \

GTHREAD_CFLAGS="-I/usr/local/glib-2.32.4/include" \

GTHREAD_LIBS="-L/usr/local/glib-2.32.4/lib -lgthread-2.0" \

LDFLAGS="-L/usr/local/lib -lm -L/usr/local/lib64 -lcrypto" \

LUA_CFLAGS="-I/usr/local/lua/include" \

LUA_LIBS="-L/usr/local/lua/lib -llua-5.1 -ldl" \

CFLAGS="-DHAVE_LUA_H -g"

# make && make install

再次启动编译后的 MySQL-Proxy 程序,几分钟后会生成如下core文件:

采用 GDB 进行追踪调试:

# cd /usr/local/mysql-proxy/bin

# gdb ./mysql-proxy /root/corefile/core-mysql-proxy-32354-1400039241

得到如下信息:

通过参考360的Atlas源码,我们最终定位到network-conn-pool-lua.c中的network_connection_pool_lua_add_connection函数,修改如下:

修改前:

修改后:

我们可以在 360 Atlas 的对应修改位置,看到如下信息,我想大家应该明白是什么原因引起了吧!!!

经测试,一切 OK !!!

关于MySQL-Proxy子进程异常退出BUG修复

时间: 2024-10-12 20:40:50

关于MySQL-Proxy子进程异常退出BUG修复的相关文章

阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例

阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例 阿里云技术支持:完颜镇江 问题现象: 磁盘空间满了,第一想到的就是删除无用的服务日志或者升级数据盘. 通常是使用du –sh去分析目录找出占用最大的. 根据经验来说基本都是日志文件占用的,那么就是停止应用清理日志,或者清理日志后重启应用即可. 但是本实例的异常是网站主页正常,但是子导航的内容为空,首先怀疑的就是磁盘满了导致mysql数据库的数据异常. 问题排查: 排查的方法是打开mysql的errlog 添加以下配置重启mysql

C#关于软件界面无响应、BUG报警、程序异常退出等情况的监控和报警

对程序的监控,一般采用另外一个进程进行监控(即主进程和监控进程),主进程运行后,先查找下看有没有还在残留运行的监控进程,如果有先结束监控进程,然后重新启动. 如何监控主程序的思路是:主程序中开辟一个共享内存映射文件,通过定时器向文件写入变化的信号数据(自定义).监控程序定时从共享内存文件中读取信号数据,并和上次读取的信号数据进行对比,如果不一致表示主程序运行正常,如果不一致,表示运行异常或者程序异常退出. 内存映射文件 内存映射文件是由一个文件到进程地址空间的映射. C#提供了允许应用程序把文件

MySQL Proxy实现数据的读写分离

做MySQL读写分离实验之前,先要搭建MySQL主从复制,可以参考我之前的两篇文章: MySQL主从配置:http://msiyuetian.blog.51cto.com/8637744/1697288 部署搭建分层次LAMP架构(最后一章节):http://msiyuetian.blog.51cto.com/8637744/1740236 实现了主从复制后,下面我们进行读写分离的安装与配置.环境说明: Linux发行版本:centos 6.7 x86_64 (三台) Hostname IP 备

erlang监控进程在启动进程退出后异常退出原因分析

一.问题引出 erlang监控进程在启动时设置了trap_exit为true,即会捕获到退出信号,会将退出信号转换为{'EXIT',Pid,Reason}存入自己的邮箱中,因此与监控进程link关系的进程退出后,监控进程能够很坦然的截获退出信号,自身不退出.启动erlang监控进程的进程,会和监控进程建立link关系,然而当启动进程退出时,监控进程没有象正常的情况,发生了异常退出,为什么设置了trap_exit为true,还会退出呢? 二.原因分析 查看supervisor的源码,supervi

MySQL Proxy 实现 MySQL 读写分离提高并发负载

工作拓扑: MySQL Proxy有一项强大功能是实现"读写分离",基本原理是让主数据库处理写方面事务,让从库处理SELECT查询. Amoeba for MySQL是一款优秀的中间件软件,同样可以实现读写分离,负载均衡等功能,并且稳定性也高于MySQL Proxy,有兴趣的可以测试一下. 环境描述: 操作系统:CentOS6.3_x64 主服务器Master:192.168.0.202 从服务器Slave:192.168.0.203 调度服务器MySQL-Proxy:192.168.

MHA监控进程异常退出(MHA版本:0.56)

最近遇到一个非常诡异的问题,mha后台进程自己中断退出了.以下是报错:Mon Dec 21 20:16:07 2015 - [info] OK.Mon Dec 21 20:16:07 2015 - [warning] shutdown_script is not defined.Mon Dec 21 20:16:07 2015 - [info] Set master ping interval 1 seconds.Mon Dec 21 20:16:07 2015 - [info] Set sec

MySQL Proxy使用

使用MySQL将读写请求转接到主从Server. 一 安装MySQL Proxy MySQL Proxy的二进制版非常方便,下载解压缩后即用. 解压缩的目录为: $mysql-proxy_installed_dir (这里为/usr/local/mysql-proxy) |_ bin |_ include |_ lib |_ share 1. 为mysql-proxy建立配置文件. 如在$mysql-proxy_installed_dir创建文件mysql-proxy.cnf,内容如下: Tex

使用MySQL Proxy解决MySQL主从同步延迟

MySQL的主从同步机制非常方便的解决了高并发读的应用需求,给Web方面开发带来了极大的便利.但这种方式有个比较大的缺陷在于MySQL的同步机制 是依赖Slave主动向Master发请求来获取数据的,而且由于服务器负载.网络拥堵等方面的原因,Master与Slave 之间的数据同步延迟是完全没有保证的.短在1秒内,长则几秒.几十秒甚至更长都有可能. 由于数据延迟问题的存在,当应用程序在Master 上进行数据更新,然后又立刻需要从数据库中读取数据时,这时候如果应用程序从Slave上取数据(这也是

解决Banshee 启动后异常退出的问题

在Ubuntu上,启动Banshee后,有时会发生Banshee立刻退出的情况.通过从命令行启动banshee,发现报出如下异常. Unhandled Exception: GLib.GException: No such file or directory at GLib.FileAdapter.EnumerateChildren (System.String attributes, FileQueryInfoFlags flags, GLib.Cancellable cancellable)