2014-04-03 94 views
0

我有以下環境:最佳日誌性能

  1. Windows XP專業版與3 GB的內存.NET 2.0
  2. Relativly舊電腦硬件(10歲)。
  3. 一個複雜的基於.NET的系統,由許多服務,進程,本地SQL服務器和WinForms GUI組成。

問題:

  1. 每個處理/服務日誌數據到其本地文件。
  2. 每個日誌都會立即刷新到文件流中。
  3. 有時,當許多進程在同一時間記錄數千條消息時,由於嚴重的文件IO操作,PC的性能變差。禁用日誌記錄證明性能恢復正常。

目標: ,使系統保持響應提升日誌性能。

我目前的解決方案的想法:

  1. 過程不登錄到他們的本地文件直接,而不是他們發送的日誌信息爲使用命名管道的本地服務。
  2. 本地日誌服務爲每個需要記錄日誌的進程打開一個命名管道和一個相應的工作線程。
  3. 本地日誌服務緩存從每個進程收到的日誌消息,直到可配置數量的日誌消息可用或可配置的時間量已過,然後日誌服務將所有日誌消息寫入相應的進程日誌文件。

我想實現這個解決方案:

  1. 客戶端執行不阻止文件IO寫操作。
  2. 日誌操作/調用將變爲異步。
  3. 文件訪問是可控制的,並且在可配置的時間量之後僅發生一次。

問題:

  1. 這是解決好?性能可以進一步提高嗎?
  2. 是否有任何開箱即用的進程間日誌庫/框架?

在此先感謝您的合作!

問候, Siraf

+0

我不知道開箱即用的進程間庫,但是你可以看看在你的進程中緩衝你的寫入。有這樣的庫。所以,保持每個進程的日誌記錄,而不是在每個Log.Write上寫入磁盤,緩衝10/100 /任何內容並將它們寫入塊中。例如,Log4Net可以配置爲執行此操作。僅此一項就可以大大減少您的I/O時間 - 在1次呼叫中順序地寫入50個條目所需的時間將少於50次單獨呼叫。你也可以使緩衝區寫入異步,只要確保你有一個方法刷新退出。 – JMarsch

+2

解決方案:從XP升級,因爲它將在一週內不被支持。 – Romoku

+0

在XP上進行上述評論或安裝SP3,以便可以使用.NET 4.0 – Measuring

回答

0

既然你受限於.NET 2.0的外觀到BeginInvokeEndInvokeasynchronous operations

如果可能嘗試多線程應用程序,以便記錄器不在分派器線程上工作。

如果仍然沒有幫助,那麼請使用PInvoke for C++ OVERLAPPED IO。