物联网架构实例—解决Linux(Ubuntu)服务器最大TCP连接数限制

2023-05-16

1.前言:

在对物联网网关进行压测的时候,发现在腾讯云部署网关程序,设备接入数量只能达到4000多个长连接,之后就再也无法接入终端了。

之前在阿里云部署的时候明明可以到达2万左右,而且腾讯云的这个服务器比阿里云的硬件配置还要高上不少,不至于那么差,随后查阅大量资料终于完美解决。

2.解决步骤:

2.1.修改/etc/security/limits.conf文件

执行脚本:

vim /etc/security/limits.conf

在文件中添加如下行(*指代系统用户名),修改Linux系统对用户的关于打开文件数的软限制和硬限制:

*soft nofile 65535
*hard nofile 65535

2.2.修改/etc/pam.d/login文件

执行脚本:

vim /etc/pam.d/login

在文件中添加如下行:

session required /lib/security/pam_limits.so

如果是64bit系统的话,应该为

session required /lib64/security/pam_limits.so

2.3.修改/etc/sysctl.conf文件

执行脚本

vim /etc/sysctl.conf

在文件中添加如下行(修改网络内核对TCP连接的有关限制):

net.ipv4.tcp_mem = 786432 2097152 3145728
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65535
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_max_tw_buckets=55000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
fs.file-max=655350

2.4.执行行如下命令(使上述设置生效)

/sbin/sysctl -p /etc/sysctl.conf
/sbin/sysctl -w net.ipv4.route.flush=1

2.5.执行如下命令(linux系统优化完网络必须调高系统允许打开的文件数才能支持大的并发)

echo ulimit -HSn 65536 >> /etc/rc.local
echo ulimit -HSn 65536 >>/root/.bash_profile
ulimit -HSn 65536

2.6.重启电脑

执行命令:

reboot

原本以为上述操作执行万后,连接数就可以上去了,最后发现竟然没有效果,是因为有一处程序的限制没有打开,下面就着重说一下这里,这个也是让我纠结了2天的才解决的。

2.7.修改程序限制

打开我的程序日志,发现终端连接数只要一到4000多以上就会频发出现一个错误,java.io.IOException:Too many open files,所以明显程序的限制没有生效。

 既然找到了问题,就朝着这个方向查询资料,为啥Linux的配置都已经生效,味道部署的程序不生效?

找到程序对应的PID,因为我这边是Java程序,所以使用命令:

ps -ef|grep -i java

 找到自己受限制的程序PID然后使用cat 命令查看程序的限制,执行命令:

cat /proc/1484/limits #1484是我那个网关程序的PID

 查了大量资料后才知道:在Centos7 与 ubuntu 系统中,/etc/security/limits.conf文件的配置作用域缩小了。/etc/security/limits.conf的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。

如果是登录用户,通过/etc/security/limits.conf与/etc/security/limits.d下的文件设置即可。

但是对于systemd service的资源设置(我们部署的运行程序则属于此项),则需修改全局配置:及下面两个配置文件:

配置文件1:

vim /etc/systemd/system.conf

配置文件2:

vim /etc/systemd/user.conf

 在这两个配置内增加下面两行:

DefaultLimitNOFILE=65535
DefaultLimitNPROC=65535

其中:system.conf是系统实例使用的;user.conf是用户实例使用的。

修改之后重启系统,可以使用脚本(reboot),但是有的Shell工具貌似对此脚本有限制,我这边使用的是XShell进行操作的,是可以正常执行reboot脚本进行服务器的重启,然后执行下面的命令查看修改后的限制是否正常。

cat /proc/1513/limits   #1513为程序的PID

最终搞明白了Linux服务器对连接数的限制原理,对于Linux服务器而已所有的TCP链路都是打开文件句柄 ,所以提升TCP连接数就是对开放对文件句柄的限制。

3.顺利进行了压力测试

通过上述操作,目前我使用单台4核8G服务器,连接数量接入到25000个,单机并发处理能力(含存储到数据库)在5500个包/秒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

物联网架构实例—解决Linux(Ubuntu)服务器最大TCP连接数限制 的相关文章

  • LeetCode 解题笔记(四)链表

    文章目录 一 总结二 题目237 删除链表中的节点 xff08 2022 03 10 xff09 19 删除链表的倒数第 N 个结点 xff08 2022 03 11 xff09 206 反转链表 xff08 2022 03 18 xff0
  • QT Quick QML 实例之 Popup 弹出界面

    QT Quick QML 实例之 Popup 弹出界面 一 演示二 实现过程1 居中弹出2 正下方弹出 所有的热爱都要不遗余力 xff0c 真正喜欢它便给它更高的优先级 xff0c 和更多的时间吧 xff01 GIT工程文件在这里 QmlL
  • QGC(GGroundControl) 系统核心架构图

    关于QGC地面站其它文章请点击这里 QGC地面站 UML 核心类图 xff1a xff08 点击图片放大看效果更好 xff09 核心系统分析图 xff1a xff08 点击图片放大看效果更好 xff09 工程结构 xff1a 整个 QGC
  • Qt 国际化翻译,函数外部字符串、Map 翻译(QT_TRANSLATE_NOOP)

    文章目录 1 Qt 的翻译流程2 利用 QT TRANSLATE NOOP 翻译 GitHub 源码 QmlLearningPro xff0c 选择子工程 xff1a TranslationsDemo pro QML 其它文章请点击这里 Q
  • IAR新建工程

    下载库函数 本文介绍基于 IAR 43 官方标准固件库 xff0c 来新建 STM8S003F 工程 xff0c STM8S 的标准固件库可以到 ST 的官方网站中找到并下载 xff1a ST官网 1 在搜索栏上搜索 STM8S003F x
  • RTSP 推流和拉流记录(运行代码)

    文章目录 1 RTSP 推流2 RTSP 拉流 1 RTSP 推流 用C 43 43 11 实现的RTSP服务器和推流器 xff0c 链接如下 RtspServer GitHub原地址 xff1a https github com PHZ7
  • FFmpeg 中 RTSP推流桌面和Android设备延时测试

    文章目录 1 FFMPEG 推流 xff1a 1 1 FFmpeg 源码准备1 2 RTSP 推流服务器 2 执行流程2 1 启动服务器2 2 执行桌面推流2 3 播放 3 安卓测试 1 FFMPEG 推流 xff1a 1 1 FFmpeg
  • Windows 下 GitKraken 6.5.1免费版本安装

    文章目录 1 安装 6 5 1 版本2 更换快捷方式3 登录 用过 GitKraken 都说好 xff0c 不过 xff0c GitKraken 从 6 5 3 版本开始收费 xff0c 它的最后一个免费版本是 6 5 1 xff0c 当你
  • QT 中的多线程之 moveToThread

    文章目录 1 概述2 方法描述3 代码 xff1a 4 运行结果5 注意事项6 结语 1 概述 在 Qt 中 xff0c 多线程也被广泛用于实现后台任务 异步操作 多任务处理等功能 通过使用多线程 xff0c 可以提高程序的响应性和用户体验
  • QT 多线程之继承 QThread

    文章目录 1 概述2 方法描述3 代码 xff1a 4 运行结果5 结语 1 概述 在 Qt 中 xff0c 可以使用 QThread 的两种方式来创建和控制线程 xff1a 继承 QThread 类和使用 QObject moveToTh
  • Qt 多线程同步:互斥锁QMutextLocker 、读写锁 QReadWriteLock、信号量 QSemaphore、 条件变量QWaitConditio、QThread::wait()

    文章目录 1 Qt 多线程为什么需要同步机制 lt font gt 2 多线程有哪些同步机制 2 1 互斥锁 xff08 QMutex xff09 2 2 读写锁 xff08 QReadWriteLock xff09 2 3 信号量 xff
  • Windows下 ffmpeg 的 “Protocol not found“ 的解决

    文章目录 1 问题描述2 排查方法记录2 1 检查代码中编码器是否安装2 2 确定ffmpeg版本号2 3 打印编译参数2 4 查看运行中调用dll 1 问题描述 调用ffmpeg库中 xff0c 如果使用 avformat open in
  • Qt 智能指针介绍: QSharedPointer、QWeakPointer 、QScopedPointer 、QPointer(附实例)

    文章目录 1 概述2 Qt 中有几种智能指针 xff1f 2 1 QSharedPointer 实例2 2 QSharedPointer 与 QWeakPointer 实例2 3 QScopedPointer 实例2 4 QPointer
  • Qt QQueue 安全的多线程队列、阻塞队列

    文章目录 1 C 43 43 queue 队列基本用法2 Qt QQueue 队列基本用法3 Qt QQueue 多线程队列4 Qt BlockingQueue 自定义线程安全的阻塞队列 1 C 43 43 queue 队列基本用法 在C
  • RT-Thread实战笔记-小白一看就会的平衡车教程(附源码)

    摘要 小伙伴们 xff0c 停更很久的RT Thread实战笔记来啦 xff0c 本章节教大家如何打造一个属于自己的平衡车 xff0c 废话不多说 xff0c 来吧 xff0c 淦 xff01 xff01 xff01 主要RT Thread
  • 点亮LED灯及IAR调试

    点亮LED灯 一开始想先通过简单的点亮一个灯的程序来试一下MCU xff0c 硬件上的原理图如下 xff1a 从这里看出PB4 PB5 PC3 PC4 PC5 PC7都能用 xff0c 还没接外设 xff0c 一开始我选择了 PB5 去外接
  • Vite项目推荐使用的几个插件——开发神器

    Vite 可以使用插件进行扩展 xff0c 这得益于 Rollup 优秀的插件接口设计和一部分 Vite 独有的额外选项 在 Vue3 43 Vite 开发中 xff0c 有下面几个插件帮助 xff0c 无异于锦上添花 xff0c 不失为日
  • linux ROS串口读取的问题

    目的是实现电脑端 xff08 ubuntu系统 xff09 与STM32通过串口建立通讯 xff0c STM32解算与其连接的传感器并将数据传送至电脑端进行编程 我们知道 xff0c 随便一个串口助手即可实现读取STM32串口数据并显示出来
  • 磁力计的基本工作原理

    参考文章地址 xff1a http blog sina com cn s blog 402c071e0102v8ig html 电子罗盘是一种重要的导航工具 xff0c 能实时提供移动物体的航向和姿态 随着半导体工艺的进步和手机操作系统的发
  • Gazebo中的turtlebot2中加入GPS模块

    ubuntu14 04 xff0c ros版本为indigo turtlebot2的仿真环境的学习参考 xff1a http learn turtlebot com 的仿真部分 想用GPS做导航 xff0c gazebo中没有GPS模块 x

随机推荐