我们有一个在Solaris(5.10,sparc 平台)上运行的多线程 C++ 应用程序。根据“pstack”,大多数线程似乎经常在下面的调用中等待太久。这对应time_t currentTime = time(NULL) ;
于应用程序代码中的“”函数,以获取当前时间(以秒为单位)。
ffffffff76cdbe1c __time (0, 23e8, 1dab58, ffffffff76c63508, ffffffff76e3e000, 2000) + 8
时区是“亚洲/利雅得”。我尝试将 TZ 变量设置为“亚洲/利雅得”以及“ <GMT+3>-3
”。但是这两种选择都没有明显的改善。此时更改服务器代码(即使有替代方法)相当困难。一个有 100 万次“”调用的测试程序(单线程,编译时没有 -O2)time(NULL)
很快就出来了。应用程序和测试程序使用gcc 4.5.1
.
还有什么我可以尝试的吗?
我同意这是一个相当广泛的问题。一旦有足够的改进来处理当前负载,我将尝试有效的建议并关闭它。
编辑 1:
请忽略上面对 time(NULL) 的引用,作为 __time 堆栈的可能原因。我根据签名进行了推断,并在源方法中找到了相同的调用。
以下是导致 __time 的另一个堆栈。
ffffffff76cdbe1c __time (0, 23e8, 1dab58, ffffffff773e5cc0, ffffffff76e3e000, 2000) + 8
ffffffff76c9c7f0 getnow (ffffffff704fb180, ffffffff773c6384, 1a311c, 2, ffffffff76e4eae8, fffc00) + 4
ffffffff76c9af0c strptime_recurse (ffffffff76e4cea0, 1, 104980178, ffffffff704fb938, ffffffff704fb180, ffffffff704fb1a4) + 34
ffffffff76c9dce8 __strptime_std (ffffffff76e4cea0, 10458b2d8, 104980178, ffffffff704fb938, 2400, 1a38ec) + 2c