1.socket是什么?
其实准确的来说,socket并不仅仅用于linux而已,它也应用于TCP/IP中。笼统的来说,socket就是指的“IP地址+端口号”。比如我有一个ssh服务器A,这时候我有两个终端通过ssh协议登陆到服务器A上面,那么这时候服务器上建立的socket连接数就是2个,那么这两个socket的连接状态就是establish。但是socket不仅仅应用与TCP/IP中,它有两个域,一个是internet domain,也就是一开始说的“IP地址+端口号”,通过网络来建立连接;而另外一个就是unix domain,而它也属于socket,则是两个进程共用一套文件系统以此通信,也就是主机内部线程之间的通信哦。
2.如何查看socket连接?
ss(socket statistics)命令可以获取socket连接信息,有点类似于netstat,但是它比netstat更强大,可以显示更详细的socket信息。它使用了tcp协议栈中的tcp_diag模块,能直接第一时间入手内核信息。
以下是ss命令的用法:
ss [参数]
如果不加任何参数,则ss会列出所有已经建立连接并不处于listen状态的socket连接
-s 显示socket概要统计,summary的意思
-n 以端口号显示socket连接
-p 以进程服务名称显示socket连接
-l 显示处在listen状态的socket连接
-t 只显示tcp的socket连接
-u 只显示udp的socket连接
-a 显示所有的socket连接,包括listen状态在内的socket连接
-x 显示unix domain的socket连接
3.应用举例
查看socket的概览

[ning.liu@centos-linux- ~]$ ss -s
Total: (kernel )
TCP: (estab , closed , orphaned , synrecv , timewait /), ports Transport Total IP IPv6
* - -
RAW
UDP
TCP
INET
FRAG
这里着重介绍一下ss -s中的synrecv参数:这里的synrecv状态代表着tcp3次握手中的第二次握手,如果这里的数值较大,一般可以断定为syn攻击。
注意:netstat -anp|grep 'SYN_RECV'同样可以查看到处于synrecv状态的socket连接哦,只不过本讲只侧重于ss来讲的。
查看所有的tcp socket连接并暴露端口号

[ning.liu@centos-linux- ~]$ ss -ant
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN *: *:*
LISTEN *: *:*
LISTEN 127.0.0.1: *:*
ESTAB 10.211.55.3: 10.211.55.2:
ESTAB 10.211.55.3: 10.211.55.4:
LISTEN ::: :::*
LISTEN ::: :::*
LISTEN ::: :::*
查看所有的udp连接并显示进程名

[ning.liu@centos-linux- ~]$ ss -aup
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN *:bootpc *:*
UNCONN *:sunrpc *:*
UNCONN *: *:*
UNCONN 127.0.0.1: *:*
UNCONN :::sunrpc :::*
UNCONN ::: :::*
UNCONN ::: :::*
4.在linux中如何保证socket连接的高并发量?
要想提高socket的高并发,要从两个方面下手。
一、修改linux用户进程所能打开的文件最大数值
第一步,首先查看当前用户每个进程所能打开的最大文件数
[root@centos-linux- ~]# ulimit -n
1024【这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件,也就是实际所能打开的文件数还不到1024】
/etc/security/limits.conf文件限制着用户可以使用的最大文件数,最大线程,最大内存等资源使用量。
修改limits.conf文件,在下面加入:
user soft nofile 10240
user hard nofile 10240
其中user指定了要修改哪个用户的打开文件数限制,可用’*'号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;10240则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。
修改/etc/pam.d/login文件,在文件中添加如下行:
session required /lib/security/pam_limits.so
这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。
第三步,查看Linux系统级的最大打开文件数限制,使用如下命令,如果满意就不需要进行下面操作

[root@centos-linux- ~]# cat /proc/sys/fs/file-max
97132【这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)12158个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。】
修改此系统硬限制的方法是修改/etc/rc.local脚本,在脚本中添加如下行:
echo 99999> /proc/sys/fs/file-max
二、调整网络内核对TCP连接的最大支持数。
/etc/sysctl.conf文件是linux中的网络内核配置文件,通过修改它我们可以做到socket进程在TCP/IP网络连接数优化,具体操作:
第一步:设置本地端口范围
net.ipv4.ip_local_port_range = 1024 65000 【这表明将系统对本地端口范围限制设置为1024~65000之间。请注意,本地端口范围的最小值必须大于或等于1024;而端口范围的最大值则应小于或等于65535。修改完后保存此文件。】
第二步:设置系统对tcp连接跟踪的最大数限制
net.ipv4.ip_conntrack_max = 10240
这表明将系统对最大跟踪的TCP连接数限制设置为10240。请注意,此限制值要尽量小,以节省对内核内存的占用。
第三步:执行sysctl -p使其立即生效

linux中对socket的理解 socket高并发的更多相关文章

  1. [转帖]Linux中buff/cache内存占用过高解决办法

    Linux中buff/cache内存占用过高解决办法 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html /proc/sys/vm/drop_cac ...

  2. php-fpm和cgi,并发响应的理解以及高并发和多线程的关系

    首先搞清楚php-fpm与cgi的关系 cgi cgi是一个web server与cgi程序(这里可以理解为是php解释器)之间进行数据传输的协议,保证了传递的是标准数据. php-cgi php-c ...

  3. Linux下配置tomcat+apr+native应对高并发

    摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服 ...

  4. (转)Linux下配置tomcat+apr+native应对高并发

    摘要:在慢速网络上Tomcat线程数开到300以上的水平,不配APR,基本上300个线程狠快就会用满,以后的请求就只好等待.但是配上APR之后,Tomcat将以JNI的形式调用Apache HTTP服 ...

  5. linux中nfs启动报rpcbind.socket failed to listen on sockets: Address family not supported by protocol

    1.systemctl start rpcbind.service 报错: [root@autodeploy ~]# journalctl -xe -- Support: http://lists.f ...

  6. Linux 中 Buffer/Cache内存占用过高解决方法

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: 这里的默认显示单位是kb,我的服务器是128G内存,所以数字显 ...

  7. Linux中buff/cache内存占用过高解决办法

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个centos7的系统上,free命令的显示内容大概是这样一个状态: 这个命令几乎是每一个使用过Linux的人必会的命令,但越是 ...

  8. [进程管理] Linux中Load average的理解

    Load average的定义 系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树.如果一个进程满足以下条件则其就会位于运行队列中: - 它没有在等待I/O操作的结果 - 它没有主动进入等待状 ...

  9. Linux中FTP的一点理解

    FTP(File Transfer Protocol)是一个非常古老并且应用十分广泛的文件传输协议,FTP协议是现今使用最为广泛的网络文件共享协议之一,我们现在也一直有在用着FTP协议来进行各种文件的 ...

随机推荐

  1. LayUI中实现上级下拉框动态加载下级下拉框js

    js代码: var form = layui.form, layer = layui.layer; form.on("select(上级)", function(data){ va ...

  2. 如何在使用layer.prompt在输入值为空的情况下点击确定继续执行逻辑?

    突然发现在使用LayUI时,用到弹出层layer.prompt时,如果文本框输入值是空的话点击确定没有反应,不能向下执行. 但是我又需要在这种情况下去继续执行判断或逻辑时该怎么做?? 示例:原代码如下 ...

  3. Android 7.0 Gallery图库源码分析2 - 分析启动流程

    前面一讲解了Gallery启动Activity以及界面如何绘制,现在开始讲解启动流程的代码逻辑. GalleryActivity的onCreate方法中调用initializeByIntent()方法 ...

  4. python--csv文件读写

    最近刚注册了kaggle账号,练习了下简单的knn算法用于手写数字识别.下载的训练和测试文本都是使用csv文件存储的,所以在此重拾下csv模块. csv文件 csv全称(Comma-Separated ...

  5. debian 9 安装后的配置,debian 9 开发环境。

    注意:以下命令用sudo或者以root用户进行 一.Xterm(在安装KDE桌面情况下)的配置(可以黏贴,复制): 首先在根目录下编辑文件.Xresources(没有可以创建) root@debian ...

  6. pytorch 4 regression 回归

    import torch import torch.nn.functional as F import matplotlib.pyplot as plt # torch.manual_seed(1) ...

  7. 【BZOJ 1221】 [HNOI2001] 软件开发

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] /* 设一个超级源点S和超级汇点T S和2*i-1各连一条容量为ni的边. 花费为0 表示每天都会产生ni条要洗的毛巾 S和2*i各 ...

  8. java解析XML saxReader.read(xml) 错误:org.dom4j.DocumentException: no protocol

    java解析XML saxReader.read(xml) 错误:org.dom4j.DocumentException: no protocol 完整错误信息: org.dom4j.Document ...

  9. Woody的Python学习笔记2

    Python多行语句 Python语句中一般以新行作为语句的结束符.但我们能够使用斜杠(\)将一行的语句分为多行显示,例如以下所看到的: total = item_one+\ item_two + \ ...

  10. OSGi 和 C++

    2011年 9月我参加了OSGi社区在达姆施塔特的会议,并且有机会与其他与会者探讨本机c++实现的OSGi规范的现状.在这一事件之前我也一直想写一篇博客,来描述关于当前实现OSGi规范的现状和努力—— ...