忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1655 | 回复: 5

【求助】perl socket server 约30天就挂 [复制链接]

论坛徽章:
0
发表于 2018-03-04 13:14 |显示全部楼层
本帖最后由 ZAROK 于 2018-03-04 13:37 编辑

    程序的用途是将接收到的http post数据转发到另2个http server,每次都是跑了20-30天就挂。
    对端数据源是2个应用系统,它们post的数据肯定一直有尝试在发送,但我这边的主线程不知是停止了监听还是不再产生子线程,导致不再有子线程日志了(主线程当时是为了提高效率,没让它写日志,只是接受socket并传递给子线程)
    比如这一次是昨晚挂掉的,最终入库的数据停在了昨晚,日志也停在了昨晚同一时间,今天早上ps -T看了一下,有40多个子线程(比平时的三四十个也差不多),只是平时的话这些子线程转发完就threads->exit(),所以过半分钟再看,TID就全变了,这次的这40多个就那么停在那,TID不再变化了。平时这个perl进程的内存使用量290MB,内存总大小24G,线程数也不多,内存使用率也不高,能是什么原因呢?
    ——之前有看到仙子姐姐对于 http://bbs.chinaunix.net/thread-651808-1-1.html 的回复
while($client = $server->accept())
这里你这样写,不死掉才怪呢。

   所以我特别想知道我的程序会不会也是因为这个挂的?
    产生子线程的历史数量应该不会成问题吧?我看到最后一条日志中的threads->tid()结果是729537(这是第729537个子线程),这个数字好像也没什么特别的。

    ——由于代码较长,为便于查看,我截取了主要的部分,大家能看出挂掉的原因是什么吗?

  1. #!/usr/bin/perl
  2. use IO::Socket::INET;
  3. use threads;
  4. use REST::Client;
  5. exit 0 if fork;

  6. my @forward = (
  7.     'http://10.1.1.10:8001',
  8.     'http://10.1.1.20:8001'
  9. );

  10. my $socket = IO::Socket::INET->new(
  11.     LocalPort => 8000,
  12.     Proto => 'tcp',
  13.     Listen => 100,
  14.     Reuse => 1 ) or die $@;

  15. while (my $client = $socket->accept()) {
  16.     threads->new(\&thread_work, $client)->detach();
  17. }

  18. sub thread_work {
  19.     my $thread_id = threads->tid();
  20.     my $client = shift;

  21.     #从socket读取
  22.     #记录日志
  23.     #向@forward转发
  24.     #记录日志
  25. }
复制代码

PS: 之所以detach()的原因是这个程序的子线程实在没什么有价值的信息可返回给主线程的,有意义的消息直接都写进日志了。

论坛徽章:
0
发表于 2018-03-06 01:58 |显示全部楼层
你说的挂是什么意思?程序不工作了,但是服务器系统资源还有很多?

什么叫做40多个线程停住了?产生的线程不工作了?什么都不干?

论坛徽章:
0
发表于 2018-03-06 09:20 |显示全部楼层
回复 2# dahe_1984

是的,主线程的两行代码中,$client=$socket->accept()能否成功暂无法知道(client是别人家的应用),但threads->new(\&thread_work, $client)->detach()肯定是不再执行了(从外边看,不再有新的线程产生,主线程还在),已存在的40个线程也不再记录日志了。
我有时看到有人说不能写成 while(my $client=$socket->accept()) ,也见过有人写成while(1) {next unless my $client=$socket->accept(); ....}但一直不理解为什么?意思是$client会有被赋予空值/0值的时候吗?

论坛徽章:
0
发表于 2018-03-06 09:27 |显示全部楼层
回复 2# dahe_1984

上一次发生在一月,这一次发生在3月,下一次……感觉就像在等月全食

论坛徽章:
39
技术图书徽章
日期:2018-08-21 13:30:492015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00平安夜徽章
日期:2015-12-26 00:06:30技术图书徽章
日期:2018-08-21 13:30:242016科比退役纪念章
日期:2018-03-07 11:23:33
发表于 2018-03-07 11:07 |显示全部楼层
猜想$client没做关闭处理?
还有,既然能跑30天,还纠结什么。
定期重启一下简单干净。
代码的bug总是改不完的。
尤其涉及多线程+网络.

论坛徽章:
0
发表于 2018-03-12 14:23 |显示全部楼层
楼主你把代码都放出来呗。
大体猜下是线程没回收,纯猜想。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP