一、Socket并发的配置

在Socket并发访问中,五元组(源IP,目的IP,协议号,源端口,目的端口)的存在,使得其的可变化比较大,但其中大多数应用的场景可以抽象到一个具体的机器中来,在这一个具体的机器的配置中,引申出未来集群和分布式的配置管理。在一个具体应用中,一般来说的是一个单机,IP是固定的,但是端口是可以动态扩展的(0~65536,但是其中有不少被默认占用了),也就是说,作为一个单机,只考虑简单的变化情况,那么只有IP和端口两个作为组合的条件。如果有写过实际程序的,可以发现在客户端,一般就是自动寻找端口的。也就是说IP和自动配置的端口来实现对不同服务器的绑定(或者说关闭后再次连接)。
服务端也可以利用这种情况来实现多进程多并发的监听,比如同时监听多个IP+不同的端口。但是,如果再进一步限制,只在单IP和同一个端口上进行高并发如何设置呢?也就是说,如果解决了这种单一的情况,那么其它复杂的情况就都可以顺理成章的解决。
下面就对这个问题进行一个初步的回答,首先要解决的是,一个进程或者一个线程,到底能打开多少个文件?因为在LINUX中,一切都是文件。网络Socket也是fd。在网上有很多回答,也有很多大牛的精彩回复,结论是2**32*2**16 = 2^48个(即两单一乘多端口)。但是其中有一些是保留的或者被天然占有的,所以会少一些,但这无所谓。
但是应该知道,理论是理论,实际是实际,在实际的开发中,每个TcpIP连接的建立,都是要耗费资源的,一般认为创建连接要创建接收和发送缓冲区各4KB共8KB,再加上协议控制块的2KB,共10KB,因为它们用:

$ sysctl -A |grep tcp_.mem
net.ipv4.tcp_rmem = 4096        87380   6291456
net.ipv4.tcp_wmem = 4096        16384   4194304

但是很遗憾,这个不太准确,因为还是常说的那句话,理论是理论,实际是实际,在实际情况中,为了更好的利用Socket通信,其实,在TCP建立连接时,并不会立刻去分配两个缓冲区。而实际情况是大约会在3K略多一些,如果有兴趣可以查找一下相关资料。
但是,再进一步,真正的应用场景中,或多或少都会有业务逻辑,这才是真正的吃资源的大户,比如你是做短视频的,单纯上亿个连接有什么意义?你必须把用户的视频分发出去,同样回到一个机器上,就是如何压榨出单机最大的负荷,从而降低成本。而视频最吃的是什么,是CPU,是显卡还是带宽还是内存,亦或是其中几个组合等。就需要根据实际情况不断的调整。
回到正题,仍然要解决最基础的问题,如何扩大并发数量,服务端默认的连接数量是1024,也就是超过这个数量,一个进程就无法再打开多的文件句柄了,也就是无法再接收更多的连接了。请继续向下看,来解决这些问题。

二、修改用户及内核配置文件

要解决问题,先得找到问题的症结,需要修改文件打开数量的限制,需要同时修改内核及用户配置文件以适应更高并发,做如下改动:
1、用户态修改:

/etc/security/limits.conf
vim /etc/security/limits.conf
* soft  nofile  65536
* hard  nofile  65536

将上面两个65536修改成了1065536。

2、修改内核态的配置
在/proc/sys/fs文件夹下,有两个文件,一个为nr_open,表示单个进程打开文件句柄数上限;另一个为file-max,表示系统范围内所有进程可打开的文件句柄的数量限制。用下面的命令看一下:

cat /proc/sys/fs/nr_open
cat /proc/sys/fs/file-max

其中nr_open默认为1048576,即一百万,暂时不用修改。
file-max默认为180566,那么就将其修改为1048576,和上面保持一致。
修改/etc/sysctl.conf文件,在里面修改file-max的值为1048576,然后保存退出。
通过运行sysctl命令,将/etc/sysctl.conf文件的内容写到/proc/sys/fs/file-max中。
注意:上述修改完成后,要使用命令重新查看,防止由于种种原因导致未修改成功。

3、为了调试,增加了修改内核转储文件大小设置
使用ulimit命令来操作:

ulimit -c  查看
ulimit -c N  设置大小,N单位为k。

上面的设置只适合当前终端,退出后变为0
永久修改:

/etc/profile:全局
.bash_profile:当前用户
ulimit  -c  N
source .bash_profile

三、问题及解决

1、出现问题
上述配置修改完成后,远程连接突然失败,然后再也无法SSH登陆。用了各种办法,咨询运维表示是22端口被占用。修改密码啥的都用了,仍然无法登陆。只好再次新开一个虚拟机,再次重复上面的第一步,然后突然无法登陆。高度怀疑是不是修改此处造成的,幸而还有一台电脑仍在此虚拟机内,将值改回,立刻可以登陆。这才明白 。那么有没有办法来规避这个问题呢?看下面的命令:

ulimit -n  查看当前值
ulimit - n  N,临时设置一个值,如果N合适,则成功,不合适,则报一个错误。

用这个条命令测试,结果发现,设置成1024*1024成功,再大则不可以。即这种设置的验证方法,可以防止出现上面的错误 。

2、解决问题
经过查询资料,发现只要设置:nr_open>=limits.conf 的 hard nofile,就不会出现这种问题,方法如下:
a、sysctl 设置 fs.nr_open 大于等于 /etc/security/limits.conf 的 hard nofile
b、直接设置 /proc/sys/fs/nr_open 会报fsync写入问题,可以echon N > /proc/sys/fs/nr_open

四、总结

一些小细节的问题,看似简单,其实挺复杂,一些看上去挺扎手的问题,其实就是一个小小的配置文件造成的。理论一定要和实践相结合!

Socket并发配置之一config的配置相关推荐

  1. appSettings 配置mysql_app.config数据库配置字符串的三种取法

    关于VS2008或VS2005中数据库配置字符串的三种取法 VS2008建立Form程序时,如果添加数据源会在配置文件app.config中自动写入连接字符串,这个字符串将会在你利用DataSet,S ...

  2. Web.Config文件配置之连接默认错误页

    在一些网站中,当网络地址发生错误时,通常会自动跳转到一个页面,并在该页面显示错误信息,此功能叶可以通过配置Web.Config文件配置实现.例如访问者在访问网站时出现错误,程序将跳转到默认页面erro ...

  3. 微信开发:配置 wx.config 实现图像接口(详细配置 wx.config 接口)

    前言   描述一下大概的应用场景,就是微信的移动端需要拍摄实时图像上传,然后传输到后台,由于我们需要的是直接可以显示的图片,所以要转换成 base 加密后的图片,然后放到 img 标签里进行展示 概述 ...

  4. kindeditor php配置,KindEditor-编辑器配置参数属性 | 小灰灰博客

    在<开发php接入富文本编辑器KindEditor>中提到了KindEditor编辑器的使用方法,通过使用KE.show(config)方法即可将编辑器添加到文档中. ·无论使用哪种方式使 ...

  5. springcloud-spring cloud config统一配置中心

    统一配置中心 为什么需要统一配置中心? 统一配置中心顾名思义,就是将配置统一管理,配置统一管理的好处是在日后大规模集群部署服务应用时相同的服务配置一致,日后再修改配置只需要统一修改全部同步,不需要一个 ...

  6. spring cloud config将配置存储在数据库中

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! Spring Cloud Config Server最常见是将配置文件放在本地或者远程Git仓库, ...

  7. app.config自定义配置节点

    本来一直用xml保存配置文件的,但有一个组件就写一个好麻烦.于是想起了自定义配置节点哈哈~~我撒娇了复习了下 首先我在ConfigManager.Instance使用单例模式,其次Reflection ...

  8. SpringCloud配置中心-Config

    本文主要讨论原理,不涉及使用示例. 一 搭建Config Server SpringCloud Config支持通过git.svn等搭建配置中心.因为目前使用git管理代码比较常见,所以接下来介绍通过 ...

  9. webpack.config.js配置遇到Error: Cannot find module '@babel/core'问题

    一. 问题描述 在配置webpack.config.js自动打包的时候,出现Error: Cannot find module '@babel/core'错误 最初以为是babel-core没有安装上 ...

最新文章

  1. c语言中字符减减自符意思,C语言中的自加自减运算
  2. 小花梨的三角形(暴力上下扫三角形)
  3. 把RNN植入体内,仅凭一张“薄片”,就能直接检测你有无心律异常 | Science子刊...
  4. 【JVM调优】JVM的运行参数
  5. Java的新项目学成在线笔记-day10(三)
  6. java占位符打印_java简单日志打印规范小记
  7. sql查询between and_SQL(二)——SQL简单查询
  8. Redux/Mobx面试题汇总
  9. TorchSeg—基于PyTorch的快速模块化语义分割开源库
  10. vmware esxi 升级 SCSI RAID卡驱动
  11. 5、最长回文子串(python)
  12. Python学习笔记1—Python字符串
  13. 最简单开启三星a6sUSB调试模式的方法
  14. 【win11远程桌面访问--基于云端服务器(腾讯云为例)frp的内网穿透实现】
  15. Ubuntu下搭建SVN与Apache权限控制
  16. 在线手写汉字识别工具
  17. tp5微信开发(二) ---- 微信关键字自动回复,图文回复,关注自动回复
  18. 【操作系统】操作系统在计算机中扮演的角色
  19. 作文经典好词好句好段摘抄大全
  20. ug计算机内存不足,史上最全的UG打开与保存提示内存不足的解决方案-NX12蓝屏

热门文章

  1. 如何修改文件的创建时间(回忆录)
  2. 【开奖】犀牛书获奖名单,留言开通成功,有奖征集意见赠书!
  3. 有知道深圳艾奕康(以前叫茂尔盛)、新钶信息系统公司、梦网科技的吗?下班后取消放首页...
  4. Iris微服务框架_golang web框架_完整示例Demo
  5. jflash烧录教程_手把手教你用一元pos机打造高速25系列flash烧录器(路由党福利)...
  6. JSR303字段校验
  7. 苏州大学计算机复试python_写在2020届苏大计算机考研872初试之后
  8. 系统集成项目管理工程师未来发展前景:
  9. 华为HCIE有什么方向?哪个最热门
  10. 2021遥感应用组二等奖:流域水质,生态监测与形貌学分析—以洞庭湖流域为例