网络开发注意事项

简介:

自己实现server时,一定要对内核TCP有关的参数做一些调整,才能使系统的吞吐量处于最佳值。需要注意的是建立连接的吞吐量,网络IO吞吐量,以及连接关闭的处理。

建立连接

我们在做性能测试的时候也许会发现,机器的硬件配置很好,但不管我们怎么调整并发数,机器的load就是一点也上不去。这种情况一般都是由于操作系统建立连接成为瓶颈。在建立连接的三次握手过程中,Linux内核使用到两个队列:

  • 未完成队列,处于SYN_RECV状态的socket队列
  • 已完成队列,处于ESTABLISHED但没有被应用accept的socket队列

我们要调整两个参数:/etc/sysctl.conf

  • net.ipv4.tcp_max_syn_backlog 未完成队列的最大长度,建议设为20480。
  • net.core.somaxconn 已完成队列的最大长度,建议设为20480。

系统关于上面两个配置的默认值很小,只有200多。如果自己开发server,一定要修改这两个配置。可以通过 /sbin/sysctl -a | grep xxx来查看。修改完后sysctl -p 重新载入内核参数。

listen方法的backlog参数

应用在listen()传入的backlog也用来指定已完成队列长度,系统取值为 min(listen_backlog, net.core.somaxconn)。因此建议在调用listen时传入很大的backlog值。

      The behaviour of the backlog parameter on TCP sockets changed with Linux 2.2.  Now it
      specifies the queue length for completely established sockets waiting to be accepted,
      instead  of  the  number of incomplete connection requests. The maximum length of the
      queue for incomplete sockets can be set using the tcp_max_syn_backlog  sysctl.   When
      syncookies  are enabled there is no logical maximum length and this sysctl setting is
      ignored.  See tcp(7) for more information.

accept()线程

如果应用调用accept()不及时,随着新连接的建立,已完成队列和未完成队列会先后达到容量上限,无法创建新的连接。

TCP读写

sendQ太小,网络的输出吞吐量就上不去,tps也会上不去。而滑动窗口的大小受到对端recvQ的大小限制,因此recvQ也不能太小。

/etc/sysctl.conf 中有几个参数可以修改socket的sendQ和recvQ的大小。

  • net.ipv4.tcp_rmem = 4096 4096 16777216 // 设置读写缓冲区 min default max
  • net.ipv4.tcp_wmem = 4096 4096 16777216
  • net.ipv4.tcp_mem = 196608 262144 393216 //单位:页

关闭连接

修改/etc/sysctl.conf中的以下参数,

  • net.ipv4.tcp_fin_timeout 主动关闭连接一方在FIN_WAIT2状态的超时时间,不会因为没有收到对端的FIN包而一直处于FIN_WAIT2。
  • net.ipv4.tcp_tw_reuse 直接重用TIME_WAIT状态的socket
  • net.ipv4.tcp_tw_recycle 回收利用TIME_WAIT状态的socket,不知道跟tcp_tw_reuse有什么区别。
  • 改为 sessionConfig.setSoLinger(-1)

工具

netstat -s

netstat -s列举出各种网络事件的次数。从中也可以找到一些线索。

目录
相关文章
|
2月前
|
存储 算法 C语言
【编程陷阱】编写出色C++代码:遵循的注意事项和最佳实践
【编程陷阱】编写出色C++代码:遵循的注意事项和最佳实践
34 0
|
4月前
|
前端开发 JavaScript NoSQL
假如你是一名专业的程序员,你将如何最快开发一个在线网站,并给出相应的代码及部署文档
假如你是一名专业的程序员,你将如何最快开发一个在线网站,并给出相应的代码及部署文档
23 0
|
8月前
|
存储 Linux 编译器
【C++】跨平台开发注意事项【下】
在 Windows 平台上适用的 C++ 代码移植到 Linux 下的注意事项
77 0
【C++】跨平台开发注意事项【下】
|
8月前
|
安全 Linux 编译器
【C++】跨平台开发注意事项【上】
将 Windows 平台上适用 C++ 代码移植到 Linux 下需要注意的事项
292 0
【C++】跨平台开发注意事项【上】
|
11月前
|
算法 安全 测试技术
嵌入式软件测试笔记2 |TEmb方法概述
嵌入式软件测试笔记2 |TEmb方法概述
100 0
|
安全 数据安全/隐私保护
定制开发混币器软件需要注意事项
定制开发混币器软件需要注意事项
|
存储 安全 数据安全/隐私保护
|
机器学习/深度学习 开发工具 Android开发
不编程也开发13个无需编程的iOS开发工具
最近很多人都想自己开发iPhone软件, 但并非每个人都知道如何编写相关代码。还好,有很多工具可以帮助非开发人员创建自己的iPhone软件,甚至不需要编程和脚本知识。这些工具有的专为小公 司打造,有的专门为特定用户打造,比如为音乐家或电子书作者打造的软件。
1793 0
|
网络协议 Linux 测试技术
网络开发注意事项
自己实现server时,一定要对内核TCP有关的参数做一些调整,才能使系统的吞吐量处于最佳值。需要注意的是建立连接的吞吐量,网络IO吞吐量,以及连接关闭的处理。 建立连接 我们在做性能测试的时候也许会发现,机器的硬件配置很好,但不管我们怎么调整并发数,机器的load就是一点也上不去。
1384 0