【问题标题】:Is this a scaleable named pipe server implementation?这是一个可扩展的命名管道服务器实现吗?
【发布时间】:2010-02-06 17:45:45
【问题描述】:

看看这个使用 MSDN 中重叠 I/O 的命名管道示例,我想知道它的可扩展性如何?如果您启动十几个客户端并让它们以 10 次/秒的速度访问服务器,每批 10 个紧接在另一个之后,然后再休眠一整秒,似乎最终客户端的一些实例会被饿死。

服务器实现: http://msdn.microsoft.com/en-us/library/aa365603%28VS.85%29.aspx

客户端实现(假设调用速度为 10 次/秒,并且有十几个实例)。 http://msdn.microsoft.com/en-us/library/aa365603%28VS.85%29.aspx

【问题讨论】:

    标签: windows performance winapi network-programming named-pipes


    【解决方案1】:

    网页指出的事实:

    • 管道服务器创建固定数量的管道实例。

    • 虽然该示例显示了对不同管道实例的同时操作,但它通过使用 OVERLAPPED 结构中的事件对象避免了对单个管道实例的同时操作。由于每个实例的读取、写入和连接操作都使用相同的事件对象,因此无法知道哪个操作的完成导致事件被设置为使用同一管道实例的同时操作的信号状态

    您可能可以放心地假设它没有应有的可扩展性;毕竟这是一个 API 使用示例;功能演示通常是此类代码最重要的设计约束。

    如果您需要 12 个客户端每秒进行 10 个连接,那么我个人会让服务器能够处理比 12 个客户端更多的客户端,以便在服务器准备新客户端连接时允许...就我个人而言'会切换到使用套接字,但这只是我(我偏向于这种方式,因为我已经完成了很多高性能套接字的工作,所以有所有的代码)......

    【讨论】:

    • 好吧,把套接字放在一边,因为我认为这里的重点是正在使用的 Windows 异步 I/O 构造,我想问题是什么是为具有低的命名管道获取异步 I/O 的更好方法CPU 实用程序。在单个管道实例上同时执行 I/O 真的会获得更好的性能吗?它会比简单地增加实例数量更好吗?当您说如果需要 12 个客户端,您将拥有超过 12 个实例时,我想这就是您建议的做法?
    • 如果可能的话,我会使用 IO Completion Ports,因为这将为您提供最具可扩展性的 I/O,但会增加一些复杂性(您还可以允许多个读/写操作,这意味着您将管理多个“每个操作”重叠结构,这将提供更高的读/写性能)。但是,也许您最好更详细地描述实际问题; “饿死”有点含糊。这些客户端是否无法连接?或未能发送/接收?您想在这里解决什么问题?
    猜你喜欢
    • 2013-08-10
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多