免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3816 | 回复: 2
打印 上一主题 下一主题

请教关于keepalived Real_server 过多导致进程崩溃 [复制链接]

论坛徽章:
1
2015亚冠之阿尔纳斯尔
日期:2015-11-11 18:05:28
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-16 02:42 |只看该作者 |倒序浏览
本帖最后由 kaixin9ok 于 2016-07-16 02:44 编辑

环境: CentOS release 6.2 2.6.32-220.el6.x86_64
keepalived-1.2.7 ipvsadm v1.26 IPVS v1.2.1

使用的是keepalived做健康检查
因为目前使用VIP的数量有200左右. 每个VIP下面realserver约在5-10个左右
每个keepalived所管理的realserver数量大于1100个左右,keepalived的healthcheckers进程就会挂掉,然后进入无限循环.
循环其间keepalived healthcheckers不能正常工作,当有RS无法连接时,keepalived不会从VIP中踢出.
时间长达1-2小时左右后,keepalived三个进程全部恢复正常.并且在恢复正常后。再次reload 或restart,还是一样会出现死循环.

想请教一下各位,keepalived是否有对Realserver列表数量有数值定义. 还是说keealived只能管理1100左右的Realserver.
在keepalived源码中似乎也没有找到对该数值的定义. 并且在出现healthcheckers进程出现崩溃时, keepalived主进程与vrrp进程工作正常(在日志中只看到healthcheckers不停的重新starting)



/var/log/message 出现的日志如下:

Jul 14 19:47:07 b02 Keepalived_healthcheckers[14203]: Cannot send get request to [10.15.200.200]:80.
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14203]: Removing service [10.100.200.200]:80 from VS [10.15.177.177]:80
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14203]: SMTP connection ERROR to [127.0.0.1]:25.
Jul 14 19:47:07 b02 Keepalived[13055]: Healthcheck child process(14203) died: Respawning
Jul 14 19:47:07 b02 Keepalived[13055]: Starting Healthcheck child process, pid=14525
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14525]: Interface queue is empty
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14525]: No such interface, eth1
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14525]: No such interface, usb0
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14525]: No such interface, bond0

查看进程时keepalived healthcheckers进程ID一直在变化.表现一直在重新starting新进程

[root@lvs]$ ps axu | grep keepalived
root     10124  0.0  0.0 109296  1144 ?        Ss   Jul15   0:04 /usr/sbin/keepalived -D
root     10126  0.0  0.0 111556  2364 ?        S    Jul15   0:04 /usr/sbin/keepalived -D
root     10405 17.0  0.0 112896  4204 ?        S    02:39   0:00 /usr/sbin/keepalived -D
root     10407  0.0  0.0   6428   496 pts/0    S+   02:39   0:00 grep keepalived
tty:[0] jobs:[0] cwd:[~]
[root@lvs]$ ps axu | grep keepalived
root     10124  0.0  0.0 109296  1144 ?        Ss   Jul15   0:04 /usr/sbin/keepalived -D
root     10126  0.0  0.0 111556  2364 ?        S    Jul15   0:04 /usr/sbin/keepalived -D
root     10701  8.0  0.0 112896  4204 ?        S    02:39   0:00 /usr/sbin/keepalived -D
root     10703  0.0  0.0   6428   496 pts/0    S+   02:39   0:00 grep keepalived
tty:[0] jobs:[0] cwd:[~]
[root@lvs]$ ps axu | grep keepalived
root     10124  0.0  0.0 109296  1144 ?        Ss   Jul15   0:04 /usr/sbin/keepalived -D
root     10126  0.0  0.0 111556  2364 ?        S    Jul15   0:04 /usr/sbin/keepalived -D
root     13041  8.0  0.0 112896  4204 ?        S    02:40   0:00 /usr/sbin/keepalived -D
root     13043  0.0  0.0   6428   496 pts/0    S+   02:40   0:00 grep keepalived
tty:[0] jobs:[0] cwd:[~]


###源码中对check检查并重新start片段~

check_respawn_thread(thread_t * thread)
{
pid_t pid;

/* Fetch thread args */
pid = THREAD_CHILD_PID(thread);

/* Restart respawning thread */
if (thread->type == THREAD_CHILD_TIMEOUT) {
thread_add_child(master, check_respawn_thread, NULL,
pid, RESPAWN_TIMER);
return 0;
}

/* We catch a SIGCHLD, handle it */
log_message(LOG_ALERT, "Healthcheck child process(%d) died: Respawning", pid);
start_check_child();
return 0;
}

经过测试得出以下结论·:


测试1: 当realserver超过1100个左右,keepalived的的Healthcheck进程会挂掉,然后不停的重启,主进程及vrrp子进程都无影响

Jul 14 19:47:07 b02 Keepalived_healthcheckers[14203]: Cannot send get request to [10.15.200.200]:80.
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14203]: Removing service [10.100.200.200]:80 from VS [10.15.177.177]:80
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14203]: SMTP connection ERROR to [127.0.0.1]:25.
Jul 14 19:47:07 b02 Keepalived[13055]: Healthcheck child process(14203) died: Respawning
Jul 14 19:47:07 b02 Keepalived[13055]: Starting Healthcheck child process, pid=14525
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14525]: Interface queue is empty
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14525]: No such interface, eth1
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14525]: No such interface, usb0
Jul 14 19:47:07 b02 Keepalived_healthcheckers[14525]: No such interface, bond0

测试2: 当realserver在1020左右 keepalived正常. 父进程及2个子进程都正常.

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
2 [报告]
发表于 2016-07-18 10:47 |只看该作者
学习了lollol

论坛徽章:
1
2015亚冠之阿尔纳斯尔
日期:2015-11-11 18:05:28
3 [报告]
发表于 2016-08-03 14:39 |只看该作者
找到问题了~

因为系统参数__FD_SETSIZE限制 ,因为keepalived使用select模式,默认select限制 1024个socket连接~

1、修改__FD_SETSIZE值   /usr/include/bits/typesizes.h     define __FD_SETSIZE   1024    更改为 4096
           注:更改过大会引起性能问题 select模型每次调用会扫描全部FD集合
     2、更改epoll模型
          注: epoll 最大并发受限于 系统打开最大文件句柄数量. 与select区别在于epoll只处理修改的部份,并不是像select全表扫描
     3、keepalived按group分
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP