【性能监控命令_04】lsof能看到什么??TCP连接状态?
lsof命令是Liunx操作系统中对文件进行监控的一个常用命令,使用该命令可以列出当前系统打开了那些文件,系统中某个进程打开了那些文件等信息。
lsof命令必须在root下运行,因为lsof命令执行时候需要访问核心内存和内核文件。
如下是直接运行使用lsof命令得到的一部分截图数据,
第一列:展示了进程的名称,
第二列:为进程ID
第四列:为进程的所有者
第五列:为文件描述符,cwd:为当前工作目录。mem:表示把磁盘文件映射到内存中。txt:进程运行的程序文件,包括编译后的代码。rtd:表示root目录。pd:表示父目录。ltx:表示共享的lib数据。m86:合并映射文件。mmap:表示把磁盘设备映射到内存中。err:文件描述信息错误。tr:表示内核跟踪文件。DEl:表示已经删除的Liunx映射文件。数字+字符,如0u、1w、2w等,0表示标准输出,1表示标准注入,2表示标准错误,u表示文件被打开,且处于读取/写入模式。r只读模式,w表示打开且处于写入模式。
第六列:为打开的文件类型,DIR 为目录,CHR特殊字符文件,LINK 链接文件,IPv4 IPV4嵌套文件.IPv6打开了一根IPv6文件,REG 普通文件,FIFO先进先出的队列文件。unix域套接字 通信方式。MPB 多路复用的块文件。MPC 多路复用的字符文件。inet intet域套接字
第七列:设备号,已逗号分隔,
第八列:文件大小
第九列:操作系统本地文件的node number或者服务器主机中的NFS文件的inode unmber或者协议类型
第十列:文件的绝对路径或者网络通信链接的地址、端口,状态或者挂载点等
lsof加参数
1、lsof -c:查看某个进程名称当前打开了那些文件。
2、lsof -p: 查看某个进程ID当前打开了那些文件。
3、lsof -i: 查看IPv4 v6下打开的文件,此时看到的大部分是网络链接通信,回包括服务段的Listen监听或者客户端和服务段的网络通信。
冒号后面加端口时,可以定位到某个端口下v4 v6模式打开的文件和该端口的网络链接通信。如上图,可看到22端口下的网络链接通信情况。可以看到22端口下有两个监听,一个是v4 另外一个是v6,都启在了root用户下,为tcp连接。
连接状态如下
在TCP协议中又一个FLAGS 字段,这个字段 包含SYN(建立连接标识)、FIN(关闭连接标识)、ACK(响应确认标识)、PSH (DATA SS数据传输标识)、RST (连接重置标识)、URG(紧急标识)。但是不管什么样子的TCP连接,都会占用服务器大量资源,且每一个连接都会占用一个端口,服务器TCP和UDP的端口总数只有65535个。超过这个范围就会造成端口不够用,应用程序就无法启动,连接也无法进行,所以服务器出现大量的,CLOSE_WAIT 和TIME_WAIT的连接时,就需要及时的查找原因并进行优化,出现CLOSE_WAIT状态,大多数是自己编写的代码或者应用程序出现了问题导致。
如果出现大量的TIME_WAIT状态连接,可以从服务端进行一些优化,让服务器更快的释放TIME_WAIT状态的连接所以占用的资源,可以参考如下方式进行优化。
a、通过/etc/sysctl.conf 文件,优化Linux操作系统的文件内核参数设置,在该文件中加入如下参数
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_max_tw_buckets = 5000
fs.file-max = 90000
net.ipv4.tcp_max_syn_backlog = 2000
net.core.somaxconn = 2048
net.ipv4.tcp_synack_retries = 1
net.ipv4.ip_local_port_range = 2048 65535
net.core.rmem_max = 2187154
net.core.wmem_max = 2187154
net.core.rmem_default = 250000
net.core.wmem_default = 250000
b、配置保存后,使用sysctl -p 命令让配置立即生效,以上调优,在nginx、apache这种的web服务器经常用到
如下为各个参数的解释
net.ipv4.tcp_syncookies = 1 表示开启syn cookies,当出现syn等待队列溢出的时,启用cookies来处理,默认情况服务器是关闭该配置的。客户端向Linux服务器建立TCP通信连接时会首先发送SYN包,发送完后, 客户端会等待服务端SYN+ACK的回复,服务端给客户端进行SYN+ACK的回复后,服务端此时会将处于SYN_RECV状态的连接保存到半连接队列中,以便等待客户端继续发送ACK 请求给服务端,直到连接最终完全建立,在出现大量的并发请求时候,这个半连接队列里面就会缓存大量的SYN_RECV状态的连接,从而导致队列溢出,队列的长度可以通过内核参数net.ipv4.tcp_max_syn_backlog 进行控制,在开启cookies后服务端就不需要在将SYN_RECV保存到半连接队列中,而是在回复SYN+ACK的时候,就将连接信息保存在ISN中返回给客户端,当客户端进行ACK请求时候,通过ISN来获取连接信息,以完成最终的TCP协议通信。
net.ipv4.tcp_tw_reuse = 1 表示连接重用,即允许操作系统将TIME_WAIT socket的连接重新用于新的tcp连接请求,默认为关闭状态。
net.ipv4.tcp_tw_recycle = 1 表示开启操作系统中的TIME_WAIT socket连接状态的快速回收,默认为关闭状态。
net.ipv4.tcp_fin_timeout = 30 设置服务器主动关闭连接时,socket 连接保持等待状态的最大时间。
net.ipv4.tcp_keepalive_time = 600 表示在请求开启keepalive时, TCP发送keepalive消息的时间间隔,默认为7200秒,设置短一些可以更快速的清理掉无效的请求。
net.ipv4.tcp_max_tw_buckets = 5000 表示连接为TIME_WAIT状态时,操作系统允许其他接收的套接字数量的最大值,过多的TIME_WAIT套接字会使web服务器变慢。
fs.file-max = 90000 表示操作系统可以同时打开的句柄数,在LINUX操作系统中,这个参数有时候会限制web服务器可以支持的最大连接数,这个参数是对贞干系统生效的。但是采用 ulimit -n 可以查看进程打开的最大句柄数,在句柄数不够的时候,通常会报oo many open files的报错。
net.ipv4.tcp_max_syn_backlog = 2000 表示服务器冷接受SYN同步包的最大客户端连接数,也就是上面提到的半连接数的最大数量,默认值为128
net.core.somaxconn = 2048 表示服务器能处理的最大客户端连接数,指的是能同时完成连接建立的最大数量,默认值为128
net.ipv4.tcp_synack_retries = 1 表示服务端在发送SYN+ACK后,在为未收到客户端的ACK请求时,服务端重新尝试发送SYN+ACK回复的重试次数。
net.ipv4.ip_local_port_range = 2048 65535 修改可以用于和客户端建立连接的端口范围,默认值配置的是32769 -61000,修改此参数是为了避免端口不够用的情况。
net.core.rmem_max = 2187154 表示操作系统内核socket 接受缓冲区的最大值 单位为字节。
net.core.wmem_max = 2187154 表示操作系统内核socket 发送缓冲区的最大值 单位为字节。
net.core.rmem_default = 250000 表 示操作系统内核socket 接收缓冲区的默认值 单位为字节
net.core.wmem_default = 250000 表示操作系统内核socket 发送缓冲区的默认值 单位为字节
c、修改/etc/security/limits.conf文件,用于修改进程能够打开的最大句柄数。
可增加如下配置
soft nofile 65535
hard nofile 65535
3、lsof +d 列出指定目录下被使用的文件(当前路径)
4、lsof +D 与+d类似,但是+D会 递归查找
5 、lsof 后面加指定文件,可以查看该文件被什么进程所使用
6 、lsof -i:@ip 可以列出指定ip的所有网络通信连接