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. css——样式的继承

    css的样式继承 在上面这段代码中,p{}为父类,b{}为子类.b{}将继承p{}. 因为<b>在<p>里面,p{}为父类,b{}为子类. 继承方式: 如果子类没有,父类有,则 ...

  2. Build rpm example:zram

    rpmbuild #ll zram-1.0.0 total 32 -rw-r--r-- 1 root root 948 Aug 21 16:44 Makefile -rw-r--r-- 1 root ...

  3. django-8-django模型系统

    <<<表关系实现>>> 1.OneToOne  models.OneToOneField('another_table', on_delete=models.CAS ...

  4. vue实现双向绑定原理

  5. JavaScript变量提升(Hoisting)的小案例

    变量提升(Hoisting)的小案例 执行以下代码的结果是什么?为什么? 答案 这段代码的执行结果是undefined 和 2. 这个结果的原因是,变量和函数都被提升(hoisted) 到了函数体的顶 ...

  6. 【codeforces 810B】Summer sell-off

    [题目链接]:http://codeforces.com/contest/810/problem/B [题意] 每天有ki件物品,你知道每天能卖掉li件; 然后让你选f天; 这f天,可以将ki乘上2; ...

  7. luogu 1865 数论 线性素数筛法

    洛谷 1865 数论 线性素数筛法 最基本的线性素数筛法,当做复习欧拉筛法了,没有尝试过使用更暴力的筛法... WA了一次,手抖没打\n 传送门 (https://www.luogu.org/prob ...

  8. 记一次在广播(BroadcastReceiver)或服务(Service)里弹窗的“完美”实践

    事情是这样的,目前在做一个医疗项目,需要定时在某个时间段比如午休时间和晚上让我们的App休眠,那么这个时候在休眠时间段如果用户按了电源键点亮屏幕了,我们就需要弹出一个全屏的窗口去做一个人性化的提示,“ ...

  9. 12:打印 1 到最大的 n 位数

    题目:输入数字 n.按顺序打印出从 1 到 最大的 n 位十进制数.比方输入 3 ,则打印出 1.2 .3 一直到最大的3位数即 999. 解析: easy知道不能用 int 等数字类型表示(大数问题 ...

  10. oracle学习之第一个存储过程:打印Hello World

    数据库对象:表.视图.索引.序列.同义词.存储过程.存储函数 存储过程:指的是存储在数据库中供全部用户程序调用的子程序叫存储过程.存储函数 存储过程和存储函数的同样点:完毕特定功能的程序 存储过程和存 ...