首页 > 解决方案 > 在多线程程序中调用 tpinit 和 tpterm 函数时速度缓慢

问题描述

tpinittptern燕尾服功能需要时间。它基本上用于客户端加入和离开应用程序的每个请求。当来自多线程客户端进程的请求数量较高时,我们观察到速度很慢。

我们尝试增加机器中的虚拟核心,但仍然面临同样的问题。

TPINIT   *   tpinitbuf;
if((tpinitbuf = (TPINIT *)tpalloc("TPINIT",(char *)NULL,TPINITNEED(16))) == (TPINIT *)NULL)
{
    printf("ERROR IS:: %s\n", tpstrerror(tperrno));
    return NULL;
}
tpinitbuf->flags = TPMULTICONTEXTS;
tpinit(tpinitbuf); //this function is taking time. 
tpgetctxt(&ctxt, 0);
tpfree ((char *) tpinitbuf) ; 
retVal=tpcall("MY_SERVICE",(char *)buf1,0,(char **) &buf2,&size,0L);
tpterm(); // this function is taking time.

理想情况下tpinittpterm应该需要大约 50 毫秒,但是当请求数量很高时,大约需要 1.3 秒。

标签: cmultithreadingtuxedo

解决方案


你为什么这样做?对线程执行一次 tpinit(),仅在线程终止时执行 tpterm()。如果您一直创建新的短期线程,则切换到使用线程池。

将“加入 Tuxedo 应用程序”视为“连接到数据库”——连接/断开连接似乎不再是一个好主意。

tpinit() 有很多事情要做:在共享内存中注册自己(使用信号量来防止并发更新),创建一个回复队列并将其注册到共享内存中(这样 BBL 可以在进程崩溃后进行清理),查找服务到队列的映射、加载插件等。Tuxedo 可能会更快,但如果你经常这样做,那是你自己的错,而不是 Tuxedo 的错。


推荐阅读