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. 转载:Vim 配置入门

    转载:Vim 配置入门 原文地址:http://www.ruanyifeng.com/blog/2018/09/vimrc.html 作者: 阮一峰 Vim 是最重要的编辑器之一,主要有下面几个优点. ...

  2. C# 基础复习 一 数据类型

    数据类型分为:值类型和引用类型 值类型:byte.short/char.int.long.float.double.decimal.enum.struct 引用类型:string.object.int ...

  3. LD_DEBUG

    LD_DEBUG 是 glibc 中的 loader 为了方便自身调试而设置的一个环境变量.通过设置这个环境变量,可以方便的看到 loader 的加载过程. LD_DEBUG=help ./main ...

  4. Cookie和Session有什么区别

    1. 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识别具体的用户,这个机制就是Session.   典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状 ...

  5. HDU1061 - Rightmost Digit

    Given a positive integer N, you should output the most right digit of N^N. Input The input contains ...

  6. BZOJ 4012 [HNOI2015]开店 (树分治+二分)

    题目大意: 给你一棵树,边有边权,点有点权,有很多次询问,求点权$\in[l,r]$的所有节点到某点$x$的距离之和,强制在线 感觉这个题应该放在动态点分之前做= = 套路方法和动态点分是一样的 每次 ...

  7. STM32CubeMx的使用分享

    1. 新建立工程(以F103ZET6为例) 2. 配置引脚(以PA0为例)   3. 配置外设(以串口为例) 4. 配置时钟 5. 外设.GPIO.中断初始化 6. 生成工程 7. 添加自己的代码 8 ...

  8. H5新增的标签总结

    1:便于排版的Form表单 HTML5为了方便排版,可以使form的表单标签脱离form的嵌套. 方法:form指定id,所有的标签标签都添加form= id属性. 例如: <form acti ...

  9. js常用事件及事件对象

  10. Maven学习总结(25)——Eclipse Maven Update 时JDK版本变更问题

    1.新建一个Maven项目JDK版本和系统版本不对应, 2.右键Maven项目->Maven->Update ProjectJDK版本改变了, 3.操作系统的JDK重装了新的版本,这是引起 ...