免费注册 查看新帖 |

Chinaunix

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

在400上下作业很慢,请教各位高手能否指点一下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-27 10:27 |只看该作者 |倒序浏览
基本情况是这样的:
    在400上我们写了一个C程序,程序名为RECVDQMA,该程序负责从6000接收交易请求,调用spawn后,进行一些简单处理,写入到DATAQ中。
    在测试机上,我们做了大量交易测试,在下作业的时候都很快,没有任何问题。
    但在生产机上,此作业的结束时间(下作业时)与作业的工作时间成正比,即作业工作几天后,下作业时,比较快就可以结束;作业工作几个月后,下作业时,处于END状态无法结束,生产情况为执行了ENDSBS后,RECVDQMA处于END状态无法结束的时间超过24小时,仍然无法结束。而且没有产生异常日志(SPOOLFILE显示“ RECVDQMA catcher: 6”,表明下作业时,RECVDQMA已经收到信号量6)。
    源程序附在下面,请各位高手花小小时间帮忙指点一下,拜谢!

    #include <stdio.h>;
    #include <stdlib.h>;
    #include <sys/socket.h>;
    #include <netinet/in.h>;
    #include <errno.h>;
    #include <spawn.h>;
    #include <recio.h>;
    #include <xxdtaa.h>;
    #include "DQLOGERR"
    #include "DEFINVAR"

    int sd, sd2=-1;
    void catcher( int sig )
    {
        close( sd );
        close( sd2 );
        printf("RECVDQMA catcher: %d??/n", sig);
        exit(1);
    }

    void main()
    {
        int  rc ;
        int addrlen=0,flag=1;
        int   spawn_fdmap??(1??);
        char  *spawn_argv??(3??),*spawn_envp??(1??);
        char  bkstu??(2??);
        struct inheritance   inherit;
        struct sockaddr_in   serveraddr;

        char   WorkName??(60??);
        char   Prg??(11??);
        char   Msg??(41??);
        int    num=0;

        struct sigaction sigact;

        _DTAA_NAME_T dtaname = {LOGDTAANAME, NEWDQLIB};

        memset( bkstu, 0, sizeof(bkstu) );
        QXXRTVDA(dtaname,1,1,bkstu);
        spawn_argv??(1??)=bkstu;
        spawn_argv??(0??)=bkstu;

        sprintf(Prg,"%-10s","RECVDQMA";
        init_para(1);
        sprintf(WorkName,"%s/%s",LIBPATH,IDQWRK64);

        if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
           sprintf(Msg,"%-40s","socket creat failed";
           dqlg_err("E",Prg,Msg);
           snd_consl("系统RECVDQMA套接字错误!!!";
           exit(-1);
        }

        sigemptyset(&sigact.sa_mask);
        sigact.sa_flags=0;
        sigact.sa_handler=catcher;
        sigaction(SIGTERM, &sigact, NULL);

        if ((rc=setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,
                      (char *)&flag,sizeof(flag)))<0)
        {
           close(sd);
           sprintf(Msg,"%-40s","set socket option failed";
           dqlg_err("E",Prg,Msg);
           snd_consl("系统RECVDQMA套接字错误!!!";
           exit(-1);
        }

        memset(&serveraddr, 0x00, sizeof(struct sockaddr_in));
        serveraddr.sin_family        = AF_INET;
        serveraddr.sin_port          = htons(ISPORT64);
        serveraddr.sin_addr.s_addr   = htonl(INADDR_ANY);
        if ((rc = bind(sd, (struct sockaddr *)&serveraddr,
                        sizeof(serveraddr))) < 0)
        {
            close(sd);
            sprintf(Msg,"%-40s","socket bind failed";
            dqlg_err("E",Prg,Msg);
            snd_consl("系统RECVDQMA套接字错误!!!";
            exit(-1);
        }

        if ((rc = listen(sd,10)) < 0)
        {
            close(sd);
            sprintf(Msg,"%-40s","socket listen failed";
            dqlg_err("E",Prg,Msg);
            snd_consl("系统RECVDQMA套接字错误!!!";
            exit(-1);
        }

        while (2>;1)
        {
            if ((sd2 = accept(sd,(struct sockaddr *)&serveraddr,
                                       &addrlen))<0)
            {
                 close(sd2);
                 num++;
                 sprintf(Msg,"errno=%d,%-20s",errno,"accept failed";
                 if ( num < LONGTIMES )
                        dqlg_err("W",Prg,Msg);
                 else
                 {
                        num = 0;
                        dqlg_err("E",Prg,Msg);
                       snd_consl("系统RECVDQMA接收呼叫失败!!!");
                 }
                 sleep(5);
                 continue;
             }
             num = 0;

             memset(&inherit, 0, sizeof(inherit));
             spawn_argv??(2??) = NULL;
             spawn_envp??(0??) = NULL;
             spawn_fdmap??(0??) = sd2;

             rc = spawn(WorkName,1,spawn_fdmap, &inherit,
                          spawn_argv, spawn_envp);
             if (rc < 0)
             {
                  sprintf(Msg,"%-40s","spawn() failed");
                  dqlg_err("E",Prg,Msg);
                  snd_consl("系统RECVDQMA子程序调用失败!!!");
                  close(sd2);
                  close(sd);
                  exit(-1);
             }
             close(sd2);
        }
        close(sd);
        exit(0);
    }

论坛徽章:
0
2 [报告]
发表于 2005-05-27 13:53 |只看该作者

在400上下作业很慢,请教各位高手能否指点一下

这个程序没有问题,问题可能处在工作者进程中,可能在工作者进程中有SOCKET没有关闭掉,能不能把工作者进程的代码贴出来看一看?

论坛徽章:
0
3 [报告]
发表于 2005-05-27 16:30 |只看该作者

在400上下作业很慢,请教各位高手能否指点一下

"作业工作几个月后,下作业时,处于END状态无法结束,"

---  这不是作业变慢问题,而是ENDJOB或ENDSBS时候出现的问题。这种现象我也遇到过,而且并不时每次都无法正常END,而是有时候会出现END很长时间才能结束。这种现象的出现与程序本身到底有多大关系还不清楚,这到底是什么原因引起的,我也一直没有找到答案。感觉像是彼时彼地作业与系统之间产生了什么问题。

论坛徽章:
0
4 [报告]
发表于 2005-05-29 00:49 |只看该作者

在400上下作业很慢,请教各位高手能否指点一下

帮你顶一下。
我也见到同样的现象,也就是子系统(SBS)起来之后再停掉,会有一个“END”的状态,而不是立刻结束,不过不象楼主所说的这么夸张,24小时都没停,一般都是几十秒,最长不超过5分钟。
期待有高人给一个详细的解释,或者是解决办法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP