c - 在多线程程序中调用 tpinit 和 tpterm 函数时速度缓慢
问题描述
tpinit
和tptern
燕尾服功能需要时间。它基本上用于客户端加入和离开应用程序的每个请求。当来自多线程客户端进程的请求数量较高时,我们观察到速度很慢。
我们尝试增加机器中的虚拟核心,但仍然面临同样的问题。
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.
理想情况下tpinit
,tpterm
应该需要大约 50 毫秒,但是当请求数量很高时,大约需要 1.3 秒。
解决方案
你为什么这样做?对线程执行一次 tpinit(),仅在线程终止时执行 tpterm()。如果您一直创建新的短期线程,则切换到使用线程池。
将“加入 Tuxedo 应用程序”视为“连接到数据库”——连接/断开连接似乎不再是一个好主意。
tpinit() 有很多事情要做:在共享内存中注册自己(使用信号量来防止并发更新),创建一个回复队列并将其注册到共享内存中(这样 BBL 可以在进程崩溃后进行清理),查找服务到队列的映射、加载插件等。Tuxedo 可能会更快,但如果你经常这样做,那是你自己的错,而不是 Tuxedo 的错。
推荐阅读
- loops - SVG.js如何循环多个动画步骤
- algorithm - 在expectiminimax(棋盘游戏)中计算状态空间
- javascript - 文件不会在服务器上呈现 .get() 请求
- python - 如果不满足单独的条件,如何从三个列表中删除相同位置的元素
- javascript - 返回列表时,DatePicker 中的 beforeShowDate 始终为 true
- python - 文件创建写入文件
- html - 如何使 div 成为容器的宽度?
- go - 使用 SAM 在本地运行时如何在我的 go lambda 环境变量中获取 SQS url?
- java - 在 webview 中包含一个小部件
- r - 从 R 中的持续时间列中拆分小时和分钟