2010-01-31 77 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。

感谢

格雷厄姆