【问题标题】:.NET Windows Service Restarts Server.NET Windows 服务重新启动服务器
【发布时间】:2012-12-02 20:43:38
【问题描述】:

我开发了一个 Windows 服务,它可以按计划备份我的文件和文件夹。它执行以下任务:

1 - 读取文件夹和文件列表

2 - 压缩它们并将它们放在临时目录中(将大文件分成 50MB 块)

3 - 将临时文件夹的内容上传到 FTP

4 - 删除临时文件夹

现在临时文件夹的大小可能在 3GB 左右,服务每天运行两次。现在我的服务器随机重启(不是在服务创建或上传数据期间),我开始认为这可能是导致我的服务器重启的 I/O 问题。

在 .NET 中优化我的服务器的最佳方法是什么?我可以将 PriorityClass 设置为BelowNormal,但我认为这不会有帮助。我的 onStart 看起来像这样......

Protected Overrides Sub OnStart(ByVal args() As String)
    ' Add code here to start your service. This method should set things
    ' in motion so your service can do its work.
    Try
        Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.BelowNormal
        Dim s As New BackupLibraryV2.main
    Catch ex As Exception
        BackupLibraryV2.util.LogEntry("", ex.Message, DateTime.Now, DateTime.Now)
    End Try

End Sub

(我应该在新线程中启动服务吗???)

是否有任何其他建议我可以尝试优化我的服务器以减少 CPU 密集度?

这是重启日志:

crash dump file: C:\Windows\Minidump\120212-14227-01.dmp
This was probably caused by the following module: ntoskrnl.exe (nt+0x7EFC0) 
Bugcheck code: 0x3B (0xC0000005, 0xFFFFF800019A7382, 0xFFFFF88008DFA9E0, 0x0)
Error: SYSTEM_SERVICE_EXCEPTION
file path: C:\Windows\system32\ntoskrnl.exe
product: Microsoft® Windows® Operating System
company: Microsoft Corporation
description: NT Kernel & System
Bug check description: This indicates that an exception happened while executing a routine that transitions from non-privileged code to privileged code. 
This appears to be a typical software driver bug and is not likely to be caused by a hardware problem. 
The crash took place in the Windows kernel. Possibly this problem is caused by another driver that cannot be identified at this time.

【问题讨论】:

  • 听起来不像是 Windows 服务的用户模式错误,因为它不太可能上下文切换到内核模式。
  • 所以肯尼,你认为它是别的什么吗?我担心的原因是我几天前将它部署到服务器,今天服务器重新启动时出现意外错误。
  • 是的,这是我的猜测。虽然你的应用程序会给失败的 IO 子系统增加压力。
  • 您是否尝试过让正在运行您的服务的服务器停止以查看错误是否仍然出现?
  • 查看应用程序日志部分的事件日志。它应该有一个包含堆栈跟踪的服务的错误条目。

标签: .net vb.net windows-services


【解决方案1】:

崩溃不太可能是由您的应用程序代码引起的。事件日志中的声明

这似乎是一个典型的软件驱动程序错误

可能是正确的。

由于您的应用程序正在执行大量 IO,它可能触发 IO 子系统驱动程序中的问题。您的 IO 系统是否使用了未作为 Windows 安装的一部分提供的驱动程序,或者您是否从制造商处更新了 IO 驱动程序?如果是这样,请尝试运行旧版本的驱动程序。

我应该在新线程中启动服务吗?

您的 OnStart 事件处理程序应立即将控制权交还给系统。在单独的线程上进行处理。

我可以将 PriorityClass 设置为BelowNormal,但我认为它没有帮助

对于这样的后台任务,BelowNormal 可能是一个合理的设置(取决于服务器还做了什么),但你是对的,它根本不应该影响服务器重启。

还有其他建议可以让我尝试优化我的服务器以减少 CPU 密集度吗?

您为什么担心 CPU 利用率?它来自ZIP操作吗?如果是这样,您可以考虑使用 7Zip。它是免费的,可以从命令行调用或从 .NET 程序链接,并让您能够设置所需的压缩级别(更高的压缩 = 更多的 CPU 和内存使用),并允许您控制用于压缩的螺纹。如果需要,它与 ZIP 兼容,并且还提供卓越的专有 .7z 压缩格式。

【讨论】:

  • 感谢 Eric 的详细回答,我检查了应用程序日志,但什么也没做。我正在使用 Ionic.dll 进行 zip 操作。你认为我在我的 onStart 事件中启动一个新线程或者它现在的设置方式很好吗?
  • @highwingers:我无法从您的代码中得知新线程的启动位置。 Dim s As New BackupLibraryV2.main 行构造了一个新对象。它是否也开始运行一个新线程?当 OnStart 返回时,我会认为 s 会超出范围并受到垃圾收集的影响,但是我的 VB.Net 从来都不是很好(这就是 C# 会发生的情况)。简短的回答,是的,在 OnStart 上开始一个新线程。另外,关于您的磁盘 IO 驱动程序的问题呢?
  • 我在专用服务器上安装了服务,驱动程序没有任何变化。是的,我的 onStart 事件创建了一个新对象。我没有在新创建的对象中创建任何线程。
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 2010-12-18
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多