新闻动态 news

关于EAS中TCP接入组件自动签退甚至消失的问题

◆问题描述:

 在EAS平台的进程监控日志easmon.log中,持续报 “组件(hxic_tcpin)()存在(1)个空闲,自动签退一个”,其中组件(hxic_tcpin)为TCP接入组件。
在渠道接入主机属性中初始进程数和最大进程数均为1,但平台在运行一段时间后, hxic_tcpin将消失。

 补充说明:
        项目组在EAS平台上开发的TCP接入组件,未使用公司标准的TCP接入组件模板,而自写的接入组件。组件中在绑定端口并开始监听后,若侦听到连接,则由父进程fork一个子进程处理此连接的所有事宜,并在处理结束后,子进程自动退出。

◆问题主题词:TCP、通讯、接入组件、fork

◆问题解释:

 EAS平台存在进程动态调度机制,以实现平台的均衡负载和资源的节约、有效使用。其原理是easmon核心进程会在一段时间间隔内,扫描在主机上配置的服务进程名及初始化进程数、最大进程数与运行引擎中TEIXServer表中登记的数量之间的关系。若表中登记的记录数大于此组件所配置的最大进程数,则easmon将会根据活跃度排序,自动签退最不活跃的进程。

 在接入组件 hxic_tcpin的main函数中,使用 eixl_InitDaemon函数为组件进程完成初始化,并在EAS运行引擎中的TEIXServer表中登记一条记录。在建立Socket监听服务后,便等待客户端的连接接入,当有连接接入时,此组件进程则fork一个子进程来处理此连接的所有事宜,其中包括对子进程进行登记,即相当于又新启动了一个hxic_tcpin的组件。因此可以看出,当组件监听到一个新连接,并成功fork一个子进程进行处理时,此时操作系统中的hxic_tcpin实际进程数为2,且在TEIXServer表中也应该是两条记录。

 而在子进程处理完成后,会主动退出,但未主动删除TEIXServer表中的登记记录。由于主机属性初始进程数和最大进程数均为1,因此在easmon在扫描时就会发现TEIXServer表中登记的记录数大于此组件登记的最大进程数,就会将最不活动的进程签退,就导致出现在日志中的 “组件(hxic_tcpin)()存在(1)个空闲,自动签退一个”。

 在EAS平台签退进程时,由于父进程是最先启动的,除fork子进程外,未做具体交易,也就未更新TEIXServer表中的活动时间,而子进程都是由父进程生成的,并完成具体的交易处理,因此在TEIXServer表中的子进程要比父进程新,并且easmon在签退进程时,很不幸,就将父进程签退。结果就会出现子进程和父进程都消失的情况,即与问题描述“平台在运行一段时间后, hxic_tcpin将消失”一致。

◆解决方案:

 根据问题解释中的原理,提供如下解决方案:
  一、 在子进行退出前,主动清除EAS运行引擎中TEIXServer表中自己的记录。
        ……
        eixl_DeleteProcess(getpid());
        exit(0);
        ……
  二、 在交易初始化之前,更新父进程和子进程的活动时间,必须先更新子进程, 再更新父进程,以保证父进程比子进程活动。
        ……
        //设置子进程为活动的
        eixl_SetActive(getpid());
        //设置父进程为活动的
        eixl_SetActive(getppid());
        ……