c - 为性能设计服务器的最佳方法是什么?

标签 c network-programming

<分区>

我正在尝试创建一个我希望具有高性能要求的服务器。这个问题涉及服务器核心。什么编程思想最能支持快速性能?

  1. 您是否将套接字分成不同的线程并在每个线程上调用阻塞的 recv()?
  2. 您是否有一个线程位于 select() 循环中,然后通知另一个线程处理各个端口?
  3. 您是否有一个线程来处理 select() 和响应?
  4. 您是否使用了 2 或 3 个端口集群而不是所有端口?
  5. 如果您使用上面指定的 select,使用阻塞端口与非阻塞端口是否重要?
  6. 什么 setsockopt 提高了性能:TCP_NODELAY,其他?

我意识到其中一些取决于用例。例如,如果有很多小数据包,关闭 TCP_NODELAY 的 6 将产生负面影响。如果响应微不足道,3 听起来可能会更快。我还没有想到会影响性能的任何其他问题也将不胜感激。

最佳答案

我将从单线程方法开始:使用非阻塞 I/O 和快速轮询机制,例如 Linux 上的边缘触发 epoll。 (其他平台也有类似的技术。)将轮询循环周围的一切都集中起来可以极大地简化程序设计,所以我肯定也会在其中加入 signalfds、timerfds 和 eventfds。然后一切都由一个中央循环处理。

如果需要多线程,这可能就像同时运行主循环几次一样简单。如果您将事件设置为“一次性”,它们将在轮询中被禁用,直到重新准备,因此处理事件的线程可以安全地假设是唯一这样做的线程(并在最后重新准备事件).您只需要同步程序不同部分之间的通信,或共享数据访问,但轮询器已经处理了很多同步。

关于c - 为性能设计服务器的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13169734/

相关文章:

c编程gcc错误: assignment from incompatible pointer type [enabled by default]

无法打开共享对象文件 : No such file or directory error while there is file

linux - Linux 中的高性能数据包处理

c - 从文件中读取多行数据

c++ - 有没有办法将基数 2^64 数字转换为其字符串形式的基数 10 值,或在 C 或 C++ 中以标准输出显示它,而不使用大数字库?

security - 您将如何测试 SSL 连接?

android - 物联网应用程序如何检测设备是否在本地?

ios - React Native/Expo iOs - 在我的 Api 上获取网络请求失败

c - 等待 execlp

c - Linux 在使用 PPID 1 重新启动时不会清理资源(套接字)