- 论坛徽章:
- 0
|
本帖最后由 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个子线程),这个数字好像也没什么特别的。
——由于代码较长,为便于查看,我截取了主要的部分,大家能看出挂掉的原因是什么吗?
- #!/usr/bin/perl
- use IO::Socket::INET;
- use threads;
- use REST::Client;
- exit 0 if fork;
- my @forward = (
- 'http://10.1.1.10:8001',
- 'http://10.1.1.20:8001'
- );
- my $socket = IO::Socket::INET->new(
- LocalPort => 8000,
- Proto => 'tcp',
- Listen => 100,
- Reuse => 1 ) or die $@;
- while (my $client = $socket->accept()) {
- threads->new(\&thread_work, $client)->detach();
- }
- sub thread_work {
- my $thread_id = threads->tid();
- my $client = shift;
- #从socket读取
- #记录日志
- #向@forward转发
- #记录日志
- }
复制代码
PS: 之所以detach()的原因是这个程序的子线程实在没什么有价值的信息可返回给主线程的,有意义的消息直接都写进日志了。
|
|