一、背景
Linux系统的基本指标包括cpu、内存、磁盘、网络等,其中网络可以细分为带宽进出口流量、连接数和tcp监控等。
本文使用Prometheus组件node_exporter采集,存储在promethues,展示在grafana面板。
二、安装node_exporter
1、下载至本地
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
2、运行node-exporter
默认运行的端口号是9100
tar xvfz node_exporter-1.3.1.linux-amd64.tar.gz
mv node_exporter-1.3.1.linux-amd64 node-exporter
cd node-exporter
nohup ./node_exporter >/dev/null 2>&1 &
至此,node_exporter进程启动完成,其进程号是15479。见上图。
- 指定端口号为9102
如果端口9100已被占用,可以另外指定运行端口。
nohup ./node_exporter --web.listen-address=":9102" >/dev/null 2>&1 &
- 查看进程
进程号是15479,与启动进程时输出的一致。
- 查看端口号
我们没有在运行的时候指定端口号,所以它默认运行的端口号是9100。从下图也可以看到,它的进程号是154709
三、prometheus配置
prometheus采集指标,是采用pull拉取的方式,必须知晓被抓取指标的地址。
对于node_exporter,它的指标地址是http://{ip}:9100/metrics (如果你是默认端口启动)
在prometheus.yml配置
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'file_sd'
metrics_path: '/metrics'
file_sd_configs:
- files:
- linux-targets.json
修改配置文件linux-targets.json
实时生效,无需重启
配置实时生效,因为我们在启动prometheus进程的时候,是采用热加载的方式。
# 保存10天的数据
./prometheus --web.enable-lifecycle --web.enable-admin-api --storage.tsdb.retention=10d
四、grafana展示
使用grafana官方面板,https://grafana.com/dashboards/8919
Node Exporter Dashboard
可以看到,这台机器的磁盘空间已使用86.9%了,标红提醒我们注意磁盘清理或扩容。
最后,我们看一看这台机器的网络情况。
TCP_tw, 是指TCP连接处于TIME_WAIT状态的数量,说明了有多少是主动关闭的连接。
附: 网络socket连接指标之TIME_WAIT
TIME_WAIT 是「主动关闭方」断开连接时的最后一个状态,该状态会持续 2MSL(Maximum Segment Lifetime) 时长,之后进入CLOSED 状态。
1、TCP_TW状态的设计初衷
TCP_TW状态的主要原因是防止由于网络原因,FIN包或者ACK包没有到达对方。如果没有进入TCP_TW状态,那么就会立即回收socket和相关资源,这个时候FIN包到了接收方,接收方返回一个ACK包,但是由于sender已经释放了相关资源,这个时候ACK就无处可去,接收方无法获取到这个ACK,这就不只是一个连接的问题了,可能会导致链接资源耗尽等问题。
2、TCP_TW是如何回收的
TCP_TW状态的回收是通过定时器来完成的。每当一个socket进入TCP_TW状态时,系统就会开启一个定时器,并等待固定时间,比如2分钟。在这个时间内,如果接收到对方的ACK包,那么这个定时器就会被立即销毁,并进入CLOSE状态。
然而,在TCP_TW状态下,如果由于ACK漏接或者其他原因,这个时间到了之后还没有收到对方的ACK包,那么这个socket就需要被回收。如果这个socket处于端口共享状态,那么socket实际上不会被立即回收,而是进入假CLOSE状态。这个时候,TCP协议会重新分配一个随机数seq,同时重置计时器,如果在一段时间之内,没有收到对方发来的重复的ACK包,那么socket就会被彻底关闭。
3、关注TCP_tw指标
-
系统中同时存在大量TCP_TW状态的socket就会导致系统资源的压力,可能会引导奔溃。为了避免这种情况,可以通过修改内核参数来限制TCP_TW状态的数量。一般来说,建议将内核参数设置为6000左右。
-
防止SYN等IP攻击。攻击者可以通过大量的SYN包来伪造TCP协议中的一个socket,从而放置于TCP_TW状态。如果这种攻击成功,系统的队列资源将被占满,无法被其他请求使用,系统就会崩溃。为了防止这个问题,可以在系统中添加过滤规则,阻止来自可疑IP地址的请求。
-
在协议栈中,应用程序和内核之间的性能问题。每进入一个TCP_TW状态,都意味着会在内核中创建一个资源对象,这个资源对象的使用可能会带来一些性能问题。如果TCP_TW状态对象过多,就有可能导致内存使用过高,而且更加影响网络系统的性能。