我們有一個在Solaris(5.10,sparc平臺)上運行的多線程C++應用程序。根據「pstack」,大部分線程似乎都在等待下面的調用,時間太長。這對應於應用程序代碼中的「time_t currentTime = time(NULL) ;
」函數以秒爲單位獲取當前時間。C++在solaris中的time()函數性能
ffffffff76cdbe1c __time (0, 23e8, 1dab58, ffffffff76c63508, ffffffff76e3e000, 2000) + 8
的時區是 「亞洲/利雅得」。我嘗試將TZ變量設置爲「亞洲/利雅得」以及「<GMT+3>-3
」。但兩種方案都沒有明顯的改善。在這一點上更改服務器代碼(即使有替代選擇)也很困難。一個測試程序(單線程,編譯時沒有-O2)有100萬個「time(NULL)
」的調用很快就出來了。應用程序&測試程序使用gcc 4.5.1
進行編譯。
還有什麼我可以嘗試嗎?
我同意這是一個相當廣泛的問題。我會嘗試一下有效的建議,並在有足夠的改進來處理當前的負載時立即關閉它。
編輯1:
請忽略的參考以上時間(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。 –
你應該提供更多的證據,「時間」真的是罪魁禍首。 'truss -c command'或dtrace'procsystime -aTn yourApp'輸出會有所幫助。順便說一下,設置TZ對於自定義時間無任何影響。 (編輯:對於後面的評論來說太遲了......) – jlliagre
@JoachimPileborg編譯器會優化調用'time'的命令,這讓我感到驚訝。它是一個外部函數,它的行爲是編譯器無法看到的,因此編譯器必須假定它可能具有可觀察的行爲。 –