ss命令结合zabbix对socket做监控 "三剑客"之awk心中无剑

本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/

最近天冷了,socket也出问题了,一直没有做监控,现在就把监控加起来,目前我们使用的有zabbix和prometheus两种监控,这里我们使用zabbix对其进行监控,这里使用的是ss命令,不使用netstat命令,因为ss的速度快很多,不信的话可以去测一下哈,一台机器的socket越多,对比越明显。而且ss命令能显示更多的内容,其实我对这两个命令不是特别的熟悉,通过man ss可以看到:

 因为个人也不熟,所以大家一起学一下吧,这篇文章主要分为三块进行说明,第一就是介绍这个ss命令,第二就是某及机器总体的socket进行监控,第三个就是某些机器连接该机器的数量进行监控,比如机器A-->(连接)机器B的次数,这样就可以看出来是哪个机器频繁发送请求了。天气真冷,敲敲键盘,搓搓腿,哈哈

一、ss命令

ss命令用于显示socket状态. 他可以显示PACKET sockets,TCP sockets,UDP sockets,DCCP sockets,RAW sockets,Unix domain sockets等等统计. 它比其他工具展示等多tcp和state信息. 它是一个非常实用、快速、有效的跟踪IP连接和sockets的新工具.SS命令可以提供如下信息:

  • 所有的TCP sockets
  • 所有的UDP sockets
  • 所有ssh/ftp/ttp/https持久连接
  • 所有连接到Xserver的本地进程
  • 使用state(例如:connected,synchronized,SYN-RECV,SYN-SENT,TIME-WAIT)、地址、端口过滤
  • 所有的state FIN-WAIT-1 tcpsocket连接以及更多

很多流行的Linux发行版都支持ss以及很多监控工具使用ss命令.熟悉这个工具有助于您更好的发现与解决系统性能问题.本人强烈建议使用ss命令替代netstat部分命令,例如netsat -ant/lnt等

直接ss命令

 对上面解释一波:

Netid #socket类型,在上面的例子中,有 TCP、u_str(unix流)等套接字
State #套接字处于什么状态,下面是TCP套接字的所有状态及说明,实际上就是TCP的三次握手和四次挥手的所有状态
Recv-Q #在 ESTAB 状态下,表示内核中还有多少字节的数据没有被上层应用读取,如果这里数值很大,应用程序可能发生了阻塞
Send-Q #在 ESTAB 状态下,表示内核发送队列中还有多少字节的数据没有收到确认的ACK,如果这个数值很大,表明接收端的接收以及处理需要加强
Local Address:Port #本地地址和端口
Peer Address:Port #远程地址和端口

然后我们接着看上面的state有哪些呢,如果特别熟悉网络的人应该很懂,至少我现在是不是特别熟悉,三次握手和四次挥手的状态:

LISTEN #服务端侦听套接字等待客户端的连接
SYN-SENT #客户端已发送套接字连接请求报文,等待连接被服务器接收
SYN-RECEIVED #服务器端接收连接请求报文后,等待客户端的确认连接的回复报文
ESTABLISHED #服务端和客户端之间成功建立了一条有效的连接,可以互相传输数据
FIN-WAIT-1 #服务器或客户端调用close函数主动向对方发出终止连接的请求报文,同时等待对方确认终止连接的回复报文
FIN-WAIT-2 #主动关闭连接端收到对方确认终止连接的回复报文,同时等待对方连接终止的请求报文,这时的状态是TCP连接的半关闭状态,可以接受数据,但是不能发送数据
CLOSE-WAIT #被动关闭端收到主动关闭端终止连接的请求报文后,向主动关闭端发送确认终止连接的回复报文,同时被动关闭端等待本地用户终止连接,这时被动关闭端的状态是TCP连接的半关闭状态,可以发送数据,但是不能接收数据
CLOSING #服务器和客户端同时向对方发送终止连接(调用close函数)请求报文,并且双方都是在收到对方发送的终止连接回复报文之前收到了对方的发送的终止连接请求报文,这个时候双方都进入了CLOSING状态,进入CLOSING状态之后,只要收到了对方对自己终止连接的回复报文,就会进入TIME-WAIT状态,所以CLOSING状态的持续时间会特别短,一般很难捕获到
LAST-ACK #被动关闭端发送完全部数据之后,向主动关闭端发送终止连接的请求报文,等待主动关闭端发送终止连接的回复报文
TIME-WAIT #主动关闭端收到被动关闭端终止连接的请求报文后,给被动关闭端发送终止连接的回复报文,等待足够时间以确保被动关闭端收到了主动关闭段发送的终止连接的回复报文
CLOSED #完全没有连接,套接字连接已经终止了

那么这些状态ss命令又怎么对应呢?(后面的是ss命令显示的状态信息)

[TCP_ESTABLISHED] = "ESTAB",[TCP_SYN_SENT] = SYN-SENTSYN-RECVFIN-WAIT-1FIN-WAIT-2TIME-WAITUNCONNCLOSE-WAITLAST-ACKLISTENCLOSING",

降到这里其实就可以去做下面的监控了,但是我还是想从别的博客里在copy一些东西过来完善下这个命令,继续往下看ss命令的使用。好像还没说命令的使用,,,

Usage: ss [ OPTIONS ]
       ss [ OPTIONS ] [ FILTER ]

其实这个命令不难,难的是会不会网络。。。

-h, --help 帮助信息
-V, --version 程序版本信息
-n, --numeric 不解析服务名称
-r, --resolve 解析主机名
-a, --all 显示所有套接字(sockets)
-l, --listening 显示监听状态的套接字(sockets)
-o, --options 显示计时器信息
-e, --extended 显示详细的套接字(sockets)信息
-m, --memory 显示套接字(socket)的内存使用情况
-p, --processes 显示使用套接字(socket)的进程
-i, --info 显示 TCP内部信息
-s, --summary 显示套接字(socket)使用概况
-4, --ipv4 仅显示IPv4的套接字(sockets)
-6, --ipv6 仅显示IPv6的套接字(sockets)
-0, --packet 显示 PACKET 套接字(socket)
-t, --tcp 仅显示 TCP套接字(sockets)
-u, --udp 仅显示 UCP套接字(sockets)
-d, --dccp 仅显示 DCCP套接字(sockets)
-w, --raw 仅显示 RAW套接字(sockets)
-x, --unix 仅显示 Unix套接字(sockets)
-f, --family=FAMILY 显示 FAMILY类型的套接字(sockets),FAMILY可选,支持 unix, inet, inet6, link, netlink
-A, --query=QUERY, --socket=QUERY
QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
-D, --diag=FILE 将原始TCP套接字(sockets)信息转储到文件
-F, --filter=FILE 从文件中都去过滤器信息
FILTER := [ state TCP-STATE ] [ EXPRESSION ]

到此为止,如上的基本都是copy(引用)过来的,地址见文末的参考文献,重点在下面的监控

二、zabbix监控机器总体的socket情况

做这个监控前可以熟悉下awk命令,很好玩的,可以参考个人博文:"三剑客"之awk心中无剑

这是使用的监控系统为zabbix,我们这里会结合zabbix的模板(这里选择模板是为了后期拓展),和自定义脚本的方式进行监控。

第一步(写脚本):二话不多说上脚本先:

vim tcp_status.sh
#################脚本内容#################
#!/bin/bash
if [ $# -ne 1 ];then
    echo Follow the script name with an argument "
fi

case $1 in

    LISTEN)
        result=`ss -ant | awk 'NR>1 {a[$1]++} END {for (b in a) print b,a[b]}' | /LISTEN/{print $2}'`
        if [ $result" == "" ];then
               0
        else
           echo $result
        fi
        ;;

    ESTAB)
        result=`ss -ant | /ESTAB/{print $2}
        ;;


    CLOSE-WAIT)
        result=`ss -ant | /CLOSE-WAIT/{print $2}
        ;;

    TIME-/TIME-WAIT/{print $2}
        ;;

    SYN-SENT)
        result=`ss -ant | /SYN-SENT/{print $2}RECV)
        result=`ss -ant | /SYN-RECV/{print $2}
        ;;

    FIN-WAIT-)
        result=`ss -ant | /FIN-WAIT-1/{print $2}/FIN-WAIT-2/{print $2}
        ;;

    UNCONN)
        result=`ss -ant | /UNCONN/{print $2}
        ;;

    LAST-ACK)
        result=`ss -ant | /LAST-ACK/{print $2}
        ;;

    CLOSING)
        result=`ss -ant | /CLOSING/{print $2}
        ;;
 esac

第二步(配置zabbix agent的配置文件)

vim  zabbix_agent.conf
##############添加如下内容#################
UnsafeUserParameters=   #有点忘记了,这个参数是自定义脚本需要配置的,有疑问的可以去查哈
UserParameter=tcp.status[*],sh /home/zabbix/tcp_status.sh $1  #这里就是用来指定刚刚写的脚本,后面传一个参数

配置好了以后记得重启zabbix agent

第三步(配置zabbix的模板,往其中添加item,trigger,graph)

新增模板,然后往其中添加item,如下图所示(具体步骤不唠叨,太简单)

 

 

 上图中key中的tcp.status指的是刚刚在第二步中的配置UserParameter=tcp.status[*],sh /home/zabbix/tcp_status.sh \$1 

然后中括号里面的内容就是\$1进行传参的参数,具体的参数就是[UNCONN]里面的UNCONN,这些值对应第一步监控脚本中的case中的每一种情况,到这里基本上完成了,不,还是画个图吧,在模板中添加graph,如下图所示:

 

 还有最重要的一步就是把配置好监控脚本的(第一步)的主机添加到该模板,到此为止这个监控就做完了,看个结果图吧

 

三、zabbix监控机器来源于各个机器的请求数

这个监控的目的就是看看到底是哪些机器访问目标机器比较频繁。

这个监控采用自发现的监控,比上面那个会难一点哈,为啥要选择自发现的监控呢,因为item不是确定的,这里选择:原地址ip和目的ip地址作为item,我们在目的ip地址进行监控,这个是不变的,所以原地址ip值会发生变化,所以这里采用的是自动生成item的方式进行监控,自动添加和删除item,其实挺好用的,只要学会了,超级简单,可以参看个人博文:zabbix自发现item监控

这里也是分为三步,写脚本,配置zabbix_agent.conf文件,配置Discovery

第一步(写脚本,这里需要两个脚本,一个用来做自发现(需要输出json格式),一个用来做item的)

vim tcp_monitory.
##################tcp_monitor.##################
#!/bin/bash
#获取数据输出到data.txt文件中,格式为:原地址ip:count:目标地址ip
#并且过滤掉count小于200的数据,这里没有分socket的状态,眉毛胡子一把抓了,个人可以根据具体的需求改进
ip_addr=`ip addr | grep -w inet | grep -v  127.0.0.1" | {print $2}'| awk -F /" {print $1}`
ss -ant | { print $5}'|grep -Ev cut -d :' -f4 | awk -v ip_addr=$ip_addr NR>1 {++s[$1]} END {for(k in s)if(s[k]>=200){print k,s[k],ip_addr}}grep -E  ^([0-9]{1,3}\.){3}[0-9]" > /home/zabbix/data.txt

#执行Python脚本,这是为了输出json格式,
python /home/zabbix/get_json.py

#####################################
#如下是get_json.py的内容
##############get_json.py################
#!/usr/bin/env python
#coding=utf-8
import json

def create_json(path):
    json_list = []
    with open(path) as f:
        for line  f.readlines():
            dict = {}
            split = line.split()
            dict[{#DES_IP}"] = split[0]
            //dict[{#LINK_COUNT}] //这个是可以不要的
            dict[{#SOU_IP}2][:-]
            json_list.append(dict)
    sum = {}
    sum[data"] = json_list
    sum = json.dumps(sum)
    print sum


if __name__ == __main__:
    path = /home/zabbix/data.txt
    create_json(path)

##############分割线:上面的是自发现的脚本###############
##############分割线:下面的是item相关脚本###############
vim  tcp_item.
##################tcp_item.####################
#!/bin/bash
export LANG=en_US.UTF-8
path=/home/zabbix/data.txt
count=`cat $path | grep $1 | 2 | `
[ 1$count" -eq 1 ] && 0 || echo $count

两个脚本都搞定了,就可以进行zabbix_agent.conf的配置了

第二步(配置zabbix_agent.conf文件)

在配置文件中新增如下内容:

UnsafeUserParameters= #如果已经配置就不需要配置了

UserParameter=discovery.tcp_monitor[*],1)">sh /home/zabbix/tcp_monitor. #自发现
UserParameter=alert.tcp_count[*],1)">sh /home/zabbix/tcp_item.1 $2 #item,其中$1,$2为item中的传递参数,用来区别item的不同

第三步:(配置Discovery,配置item,trigger,graph)

这里还是选择在zabbix的模板上进行配置,现在新增一个Discovery

   然后在Discovery上配置item,trigger,graph

   配置item:

 

  上面的DES_IP,SOU_IP来源于自发现脚本中的Python脚本,用于输出的格式。alter.tcp_count是UserParameter=alert.tcp_count[*],sh /home/zabbix/tcp_item.sh \$1 \$2,后面的\$1,\$2与DES_IP,SOU_IP相对应生成唯一确定的item。

item配置完毕后就可以配置trigger了:

 

  接下来继续配置graph了

 

最后把机器添加到模板(是不是说反了?),然后看结果

 大功告成!!!!!!!

参考网址:

http://www.ttlsa.com/linux-command/ss-replace-netstat/

https://blog.csdn.net/fengye_csdn/article/details/109212726

https://blog.csdn.net/m0_37814112/article/details/80701909

http://www.xitongzhijia.net/xtjc/20141230/33791.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、信号(signal)、消息队列、共享内存、信号量、套接字(socket)。管道用于具有亲缘关系的进程间通信,有名管道的每个管道具有名字,使没有亲缘关系的进程间也可以通信。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别对整个系统的性能做统计,而进程级别则具体到进程,为每个进程维护统计信息。

按实现原理分,可分为基于计数器和跟踪以及剖析。含义如下:

计数器:内核维护的统计数据,通常为无符号整型,用于对发生的事件计数,比如,网络包接收计数器,磁
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书验证,详细追踪整个交互过程,可用于调用网络后端接口,诊断http和https网络服务故障。
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满、fd泄漏等问题。命令包括ping、fping、tcpdump、lsof、netstat、/proc/$pid/fd、du、grep、traceroute、dig。
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的进程数目,用uptime查看到负载很高,既有可能是CPU利用率高,也可能是大量在等待io的进程导致,用mpstat查看每个CPU的使用情况,查看CPU的使用率或者CPU花在等待io的时间,接着用pidstat定位具体的进程
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线程切换及中断切换,进程切换的开销较大,除了需要保存寄存器和程序计数器中的值还需保存全局变量、栈等到内存中,以便下次运行恢复,而同一进程中的线程切换开销会小很多,只需更新寄存器和线程独有的栈,共享资源如打开的文件、全局变量等无需切换,当硬件中
1.top命令 作用:该命令可以按CPU使用.内存使用和执行时间对任务进行排序,常用来监控系统中占用CPU或内存较高的程序及CPU和内存的负载。 默认视图: 当想看系统负载时,可观察汇总的%CPU中的us用户进程和sy系统进程是否占用CPU很高,相加接近100%就说明占用很高了,有些程序可能得不到及
文章浏览阅读1.8k次,点赞63次,收藏54次。Linux下的目录权限!!!粘滞位!!!超详解!!!
文章浏览阅读1.6k次,点赞44次,收藏38次。关于Qt的安装、Windows、Linux、MacBook_mack book 安装qt
本文介绍了使用shell脚本编写一个 Hello
文章浏览阅读1.5k次,点赞37次,收藏43次。【Linux】初识Linux——了解操作系统的发展历史以及初次体验Linux编程环境
文章浏览阅读3k次,点赞34次,收藏156次。Linux超详细笔记,个人学习时很认真的记录的,觉得好的麻烦点个赞。
文章浏览阅读6.8k次,点赞109次,收藏114次。【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.5p1(亲测无问题,建议收藏)_openssh_9.5p1
文章浏览阅读3.5k次,点赞93次,收藏78次。初识Linux中的线程,理解线程的各种概念,理解进程地址空间中的页表转换,介绍pthread线程库并理解线程库!
文章浏览阅读863次。出现此问题为Linux文件权限问题,解决方案为回到引擎目录执行命令。输入用户密码后运行./UnrealEditor。_increasing per-process limit of core file size to infinity.
文章浏览阅读2.9k次。使用文本编辑器:打开CSV文件,并使用文本编辑器(如Notepad++、Sublime Text、Visual Studio Code等)来查看文件的字符编码格式。通常在编辑器的底部状态栏或设置中可以找到当前编码的显示。请注意,上述方法并非绝对准确,特别是当文件没有明确的编码标识时。因此,如果你发现CSV文件在不同的工具或方法中显示不同的编码格式,可能需要进行进一步的分析和判断,或者尝试使用不同的编码转换方法。该命令将输出文件的MIME类型和编码信息。使用命令行工具:在命令行中,你可以使用。_shell读取csv文件逐行处理
本文介绍了如何在Linux系统中升级gcc版本,以便更好地支持C++11及以上版本的新特性。通过升级gcc,可以提升编译器的功能和性能,获得更好的开发体验。详细的步骤和方法请参考原文链接。
文章浏览阅读4.4k次,点赞6次,收藏19次。Mosquitto是一个开源的MQTT消息代理服务器。MQTT是一个轻量级的、基于发布/订阅模式的消息传输协议。 mosquitto的安装使用比较简单,可以方便的来进行一些测试。_linux mosquitto
文章浏览阅读7.2k次,点赞2次,收藏12次。Linux中,用于根目录下有一个.ssh目录,保存了ssh相关的key和一些记录文件。_~/.ssh/
文章浏览阅读4.5k次,点赞5次,收藏18次。首先需要安装 snmp ,使用下面的命令进行安装安装完毕之后,使用下面的命令查看是否安装成功当命令行显示如图即为安装成功。_snmp工具