网络开发注意事项

简介:

自己实现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列举出各种网络事件的次数。从中也可以找到一些线索。

目录
相关文章
|
机器学习/深度学习 虚拟化 数据中心
NVIDIA T4和A10:不同应用场景下的GPU加速器选择
在数据中心和云计算领域,GPU加速器扮演着至关重要的角色。NVIDIA T4和A10是两款适用于不同应用场景的GPU加速器。本文将比较它们的性能和适用场景,帮助读者更好地选择适合自己需求的GPU实例。
6695 0
【全是精华】Token的获取和使用-FastApi版
【全是精华】Token的获取和使用-FastApi版
1491 0
wireshark 报文颜色
wireshark 报文颜色
2254 8
|
9月前
|
数据可视化 数据挖掘 BI
Quick BI 深度体验:数据洞察,触手可及——打造智能零售分析利器
作为一名数据分析师,我深度体验了阿里云Quick BI。这是一款功能强大的全场景BI平台,支持多数据源接入与智能分析,操作简单且智能化程度高。通过上传Excel文件即可快速生成数据集,并利用丰富图表进行可视化分析。其“智能小Q助手”可对话式查询数据、自动生成报表,极大降低分析门槛。尽管新手引导和移动端体验尚有优化空间,但Quick BI无疑是企业实现数据驱动决策的有力工具。强烈推荐给希望提升业务竞争力的企业!
基于模糊控制的AMT自动变速汽车换档智能控制系统simulink建模与仿真
本课题基于模糊控制理论,利用MATLAB2022a的Simulink工具对AMT自动变速汽车换挡智能控制系统进行建模与仿真。系统输入为车速V、加速度Ac和发动机转速a,输出为目标挡位。通过模糊化、规则库、推理和解模糊化四个步骤,实现对非线性、不确定系统的智能控制,模拟经验丰富的驾驶员选择最佳挡位,以平衡动力性、经济性和驾驶舒适性。仿真结果显示了不同工况下的换挡策略,验证了系统的有效性和可行性。
|
SQL 关系型数据库 MySQL
MySQL 中exists与in及any的用法详解
MySQL 中exists与in及any的用法详解
378 3
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
334 0
|
存储 关系型数据库 MySQL
什么是MySQL索引下推
MySQL索引下推(Index Condition Pushdown)是一种优化技术,它将查询条件下推到存储引擎层进行过滤,减少了存储引擎返回给MySQL服务器的数据量,从而提高查询性能。
598 0
|
JSON Rust 监控
公司电脑监控软件的Rust编程实现与安全性提升
这篇文章介绍了如何使用Rust编程语言开发一个基础的企业电脑监控软件,包括初始化项目、捕获键盘输入、监控网络活动。同时,文章强调了提升安全性的重要性,提出了数据加密(如AES)和完整性校验(如SHA-256)的方法,并展示了如何将监控数据自动提交到远程服务器。通过Rust,开发者能创建高效且安全的监控解决方案。
540 2
springCloud之配置中心Config
springCloud之配置中心Config
143 0