【发布时间】:2013-07-25 13:29:38
【问题描述】:
我们有一个在 Solaris(5.10,sparc 平台)上运行的多线程 C++ 应用程序。根据“pstack”,大多数线程似乎经常在下面的调用中等待太久。这对应于应用程序代码中的“time_t currentTime = time(NULL) ;”函数获取当前时间(以秒为单位)。
ffffffff76cdbe1c __time (0, 23e8, 1dab58, ffffffff76c63508, ffffffff76e3e000, 2000) + 8
时区是“亚洲/利雅得”。我尝试将 TZ 变量设置为“Asia/Riyadh”以及“<GMT+3>-3”。但是这两种选择都没有明显的改善。此时更改服务器代码(即使有替代方法)相当困难。一个有 100 万次“time(NULL)”调用的测试程序(单线程,编译时没有 -O2)很快就出来了。应用程序和测试程序使用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
【问题讨论】:
-
时区对
time()的返回值没有影响,至少在Unix下是这样。始终是 UTC。 -
您应该提供更多证据
time确实是罪魁祸首。truss -c command或 dtraceprocsystime -aTn yourApp输出会有所帮助。顺便说一句,设置 TZ 对时间调用本身没有任何影响。 (编辑:后一条评论为时已晚......) -
@JoachimPileborg 我很惊讶编译器优化了对
time的调用。它是一个外部函数,编译器看不到它的行为,因此编译器必须假设它可能具有可观察到的行为。 -
我认为我对导致上述堆栈的实际函数是错误的。我在 time() 调用下面的方法中也看到了 localtime() 调用,我认为它依赖于 TZ。我尝试根据我们很久以前遇到的类似问题更改 TZ。
标签: c++ performance time solaris