2010-01-31 95 views
1

我有一些運行Windows 2000的嵌入式PC很慢,並且無法可靠地啓動服務。發出命令'net start xxx'和'xxx服務正在啓動'之間有一個非常明顯的延遲。這導致我的服務無法啓動。網絡啓動命令延遲?

我的服務經常無法接收到「開始」命令(我正在記錄此事件,並且可以看到它從不發生)。

我試着在一個更快的XP盒子上重複這個,但延遲當然要短得多。然而,我故意在我的Onstart處理程序中添加一個sleep(60000) - 以模擬緩慢的啓動。

在這個(XP)盒子上 - 即使網絡啓動命令返回'xxx服務無法啓動(大約20多秒後),服務似乎繼續並且確實開始。在此期間,服務經理報告「開始」 - 直到我的睡眠(60000)完成並開始服務管理器報告。

我還嘗試將'ServicesPipeTimeout'註冊表項設置爲65000 - 這似乎沒有任何區別:-O - 是的,我做了重新啓動;-)。

有沒有人有任何想法爲什麼發生這種情況請??。即使我已將我的'ServicesPipeTimeout'註冊表項設置爲65000 - 網絡啓動在20秒左右後失敗:-O。

看起來如果我在這個「網絡啓動」命令超時之前設法發出啓動命令 - 我的服務確實會啓動。這就是爲什麼我嘗試將'ServicesPipeTimeout'註冊表項設置爲65000 - 但它似乎沒有任何區別。

NB我的服務應用程序是用C#編寫的,使用VS2008,目標是.Net Framework V2--就像舊2000盒可以支持的那樣。

非常感謝 - 希望永遠....

問候

格雷厄姆

回答

1

嗯,這還真是控制超時ServicePipeTimeout。什麼是不明確的是什麼時候這個超時計時器開始滴答。 OnStart()沒有被調用的事實將表明它在SCM創建進程時開始。可以做出的下一個想法是,無論註冊表值如何,30秒超時仍然適用於流程開始時間。

如果.NET冷啓動時間超過30秒,那麼此框的形狀非常差。冷啓動時間主要由硬盤性能決定,大約85%的時間用於定位和加載DLL。一般。如果該盒子從未將其硬盤碎片整理過,並且最近已經在其上安裝了.NET,則可能會發生這種情況。這將導致.NET文件的簇被分散到整個磁盤上,需要很多讀頭移動。這可以顯着降低數據吞吐量,如果每個羣集位於不同的軌道上,則每秒鐘的數據傳輸速率可低至每秒千字節。

解決這個問題可能與碎片整理驅動器一樣簡單。詢問該問題在superuser.com

0

Hmmmm,

我做了一些更多的工作就這個問題和它沒有真正的.Net這是考慮它的時間,它的ServiceController的接口:-O。

要解決此問題,請寫一個'Controller'應用程序(使用.Net 2),並且holdup正在調用'sc'。開始」 - 這是第一個日誌條目後立即打電話,但我得到了一個異常〜30秒後

02 2010年2月07:15:26:752,CarwashClient被停止 2010 2月2日七點15分57秒: 556,StartService():異常:無法啓動計算機服務CarwashClient ''。 02 2010年2月07:15:57:586,StartService():異常:服務沒有及時到開始或控制請求現在

- 作爲控制器應用程序使用的.Net,那麼大多數的所需的庫將會被加載。

我的服務從未見過的OnStart事件 - 因爲它也記錄並沒有什麼出現在日誌中。

我的服務還沒有定義的依賴關係 - 它只是沒有得到的OnStart事件:-O。

我現在已經重寫我的控制器,它得到超時異常的情況下重試3次。稍後會再次嘗試時,我可以回去到箱....

顯然有一些重大的讀取延遲與ServiceController的圖書館我想事情:-O。

要回答所提出的其他各點,其僅在嵌入式PC 300MHz處理器:-)。即便如此 - 它不應該這麼慢。儘管對碎片整理器有好處,但它迄今發生在兩個盒子中的兩個:-O。

感謝

格雷厄姆