【问题标题】:Architecture and performance issue架构和性能问题
【发布时间】:2011-12-21 02:12:23
【问题描述】:

我有一个关于架构/性能的问题。我说的是同时处理多个客户端请求的 SIP 服务器。我想每个请求都在一个专用线程中处理。在进程结束时,相关线程日志请求文件中的特定信息。我想优化处理的最后一部分。我的意思是我想知道您提出的替代方案,而不是将这些信息记录在文件中。为什么?因为在处理后写入文件会使用我用来处理其他到达请求的资源。

首先,您对这个问题有何看法?而且,如果您认为这是一个“真实”的问题(我的意思是替代方案可以优化性能),您有什么建议?

我考虑将数据记录到队列中,并在另一台机器中使用另一个进程,该进程将从队列中读取并写入文件。

感谢您的建议

【问题讨论】:

  • 这个问题涉及面比较广,不知道需求是很难回答的。如果您需要记录,那么花费在记录上的资源是物有所值的。如果没有,请不要登录。要考虑日志记录的替代方案,我们需要更多地了解环境和要求。在另一台机器上记录数据不一定便宜,在这两种情况下都必须序列化数据。
  • @thiton 我说的是 SIP 服务器。一般来说,一个请求就是一个调用请求,一个线程专门用于这个调用,直到终止。在通话结束时(甚至通话期间出现错误),我需要在某个地方保留有关通话的信息​​。在当前设计中,调用信息由同一线程写入文件。我唯一的要求是我需要保留通话信息。

标签: multithreading performance architecture concurrency


【解决方案1】:

如果要求在请求返回之前写入日志 - 即日志记录不是原子响应的一部分 - 那么您可以选择返回响应并仅启动记录操作。

将日志数据放在内存队列中似乎是合理的。您可以在同一台机器或另一台机器上读取该队列并写入磁盘。我将从您的应用程序中的一个线程开始,因为这是最容易实现的,并且由于磁盘 I/O 将成为限制因素,因此它不会对您的服务器产生太大影响。

如果需要在返回响应之前写入日志,您仍然可以选择使用像 MSMQ 这样的可靠队列。

【讨论】:

  • 不,可以在请求处理后的任何时候进行日志记录(关于一定的时间限制)。另外,如果在另一台机器上进行日志记录,您如何看待性能提升?
  • 是否需要记录?如果发送了响应,然后由于某种原因记录操作失败,会发生什么情况?
  • 是的,此日志记录是必需的,因为我需要这些信息进行进一步处理。如果服务器接收到呼叫请求并终止,我希望记录此呼叫。
  • 那么无论你使用什么队列,它都必须是RELIABLE。您选择的队列取决于您的技术堆栈。
【解决方案2】:

我怀疑将日志记录移动到另一台机器所涉及的网络开销可能会产生比它解决的问题更多的问题。我会选择@Nicholas 的解决方案——将日志排入同一台机器上的一个线程。队列允许松弛,因此可以减轻偶尔的磁盘延迟,并且日志记录线程可以进行自己的优化,例如。等到它有一个集群大小的日志后再写入。其他事情,比如每天打开一个新的日志文件,或者当日志文件达到限制大小时也更容易,而不会影响主服务器的性能。

即使您在另一台机器上登录,您仍应将日志记录排队以减少网络延迟。

如果队列中的日志对象包含“请求”枚举(例如 ElogWrite、ElogNewFile、ElogPath、ElogShutdown),您可以同时尝试这两种方法 - 您可以排队请求日志线程以关闭其当前日志文件并在运行时打开联网机器上文件的路径 - 队列缓冲区会吸收这样做的延迟。

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2014-06-09
    • 2011-11-16
    相关资源
    最近更新 更多