使用结构化异常处理的多线程服务器

4

这篇文章概述了为什么结构化异常处理是有问题的。有没有一种方法可以在解决文章中提到的问题的同时防止服务器崩溃?

我有一个服务器软件,大约同时运行400个连接的用户。但是如果出现崩溃,所有400个用户都会受到影响。我们添加了结构化异常处理并享受了一段时间的成果,但最终不得不将其删除,因为有些崩溃会导致整个服务器挂起(这比只是让它崩溃并重新启动更糟糕)。

所以我们有以下情况:

  • 使用SEH:对于大多数崩溃,只有400个用户中的1个会出现问题
  • 不使用SEH:如果任何用户崩溃,所有400个用户都会受到影响。
  • 但有时使用SEH:服务器挂起,所有400个用户和尝试连接的未来用户都会受到影响。
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3

因为程序随机崩溃而使用SEH是一个坏主意。它不是你可以撒在程序上使它停止崩溃的魔法粉尘。追踪和修复导致崩溃的错误是正确的解决方案。

当您真正需要处理结构化异常时,使用SEH是可以的。Larry Osterman发表了一篇后续文章,解释了哪些情况需要使用SEH:内存映射文件、RPC和安全边界转换


2
将您的程序分解成工作进程和单个服务器进程。服务器进程将处理初始请求,然后将它们移交给工作进程。如果一个工作进程崩溃,只有该工作进程上的用户受到影响。不要使用SEH进行一般异常处理——正如您发现的那样,它可能会让您陷入死锁,并且您仍然可能会崩溃。

你可以不那么细粒度化。我不知道你的负载情况,但我敢打赌你可以按照每个工作进程的这样这样多来分解它。 - 1800 INFORMATION
可能会有用的是将其作为工作进程数量的参数传入。 - Brian R. Bondy
如果你想要能够扩展并获得良好的性能,我不会建议你这样做...但是我非常喜欢IOCP和重叠IO用于服务器。不要让程序中的错误决定架构决策,就好像你无法修复这些错误一样。 - Len Holgate
有时候你并不总是完全掌控运行在进程空间中的代码,例如插件、Web服务器等。在这种情况下,将工作进程分离出来是一个好的架构设计。 - 1800 INFORMATION

1

修复你的程序中的错误? ;)

个人建议保留SEH处理程序,让它们转储出访问冲突或其他问题发生的调用堆栈,并解决问题。 “有时服务器会挂起”的问题可能是由于线程引起的死锁造成的,因此不太可能与使用SEH本身有关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,