cpu飙升问题排查 编写脚本文件===》 统计1分钟内访问nginx次数超过10次的ip地址 找出nginx访问的峰值 批量处理文本信息

cpu飙升排查思路

  1. 先排查进程的cpu占比

R:运行状态 S:睡眠状态
排查一些短频快的进程,(例如写一个计划任务,每个0.01秒运行一次)查看计划任务有无异常等

  1. 排查硬盘的io,(io本身并不占用cup资源,但是io行为需要cpu下发指令)
  1. cpu有可能一直在下发io指令;ps aux | grep “D+”
    D+表示不可能中断状态(硬盘忙不过来,cpu一直在下发io指令)
  2. iostat 1 3
    每个1秒刷一次,刷3次,查看%iowait(cpu在执行io命令时的占比)
  3. 查看swap分区,查看当前系统是否过多占用swap分区
    cat /proc/sys/vm/swappiness ;值一般0-100之间(一般调整在10左右),值越大越是尽可能的占用swap分区
  1. 查看日志信息,判断该服务器是否正在被人攻击

tail -f /var/log/secure ;查看安全日志
如果出现服务器被攻击,例如暴力破解密码这样的情况,需要耗费cpu资源进行验证
vim /etc/ssh/sshd_config ,修改ssh默认端口,增加暴力破解的破解难度

统计1分钟内访问nginx次数超过10次的ip脚本

使用该脚本,nginx主配置文件的日志记录格式必须是Jason格式,参照博主的Nginx优化博文
https://blog.csdn.net/Yosigo_/article/details/117406524?spm=1001.2014.3001.5501

#!/bin/bash

NGINX_LOG=/var/log/nginx/access.log
# 1970年到当前的时间,单位s(秒)
TIME=`date +%s`
# 距离1970年,一个分钟之前的时间
DATE=`echo $TIME - 60 | bc`
# 定义一个关联数组
declare -A IP
while read line
do
        # 日志记录的时间,转换成距离1970年的时间,单位s(秒)
        timestamp=`echo $line | grep -oE '[0-9]{4}.*T[0-9]{2}:[0-9]{2}:[0-9]{2}'`
        timestamp=`date -d "$timestamp" +%s`
        # 如果日志记录的时间在一个小时以内,那么符合判断条件
        if (( $TIME >= $timestamp && $DATE <= $timestamp ));then
                # 定义一个ip地址变量
                ip=`echo $line| awk -F'"' '{print $12}'`
                # 判断数组IP的value值存不存在,wc -L统计每一个value的长度
                number=`echo ${IP["$ip"]} | wc -L`
                # 初始化一个ip计数为0,开始计数
                [ $number -eq 0 ] && IP["$ip"]=0
                num=${IP["$ip"]}
                # 生成关联数组IP["$ip"]=次数
                IP["$ip"]=`echo "$num + 1" | bc`
        fi
done < $NGINX_LOG

# 遍历ip地址(key值)
for i in ${!IP[*]}
do
        # 如果IP["$ip"]的value值大于10,那么打印出ip地址
        if (( ${IP[$i]} >= 10 ));then
                echo $i
        fi
done

找出nginx访问的峰值(按照大于10次来计算),按每个小时计算

使用该脚本,nginx主配置文件的日志记录格式必须是Jason格式,参照博主的Nginx优化博文
https://blog.csdn.net/Yosigo_/article/details/117406524?spm=1001.2014.3001.5501

#!/bin/bash

NGINX_LOG=/var/log/nginx/access.log

declare -A IP

while read line
do
	# 日志记录的时间,记录时间格式例如"2021062910",哪个时间段,nginx被访问的次数最多
	timestamp=`echo $line | grep -oE '[0-9]{4}.*T[0-9]{2}:[0-9]{2}:[0-9]{2}'`
	timestamp=`date -d "$timestamp" +%Y%m%d%H`

	# 判断数组IP的value值存不存在,wc -L统计每一个value的长度
	number=`echo ${IP["$timestamp"]} | wc -L`
	# 初始化一个ip计数为0,开始计数
	[ $number -eq 0 ] && IP["$timestamp"]=0
	# 数组通过key值取value,value值为访问次数
	num=${IP["$timestamp"]}
	# 生成关联数组IP["时间"]=次数
	IP["$timestamp"]=`echo "$num + 1" | bc`
done < $NGINX_LOG

# 遍历时间(key值)
for i in ${!IP[*]}
do
	# 如果IP["$ip"]的value值大于10,那么打印Nginx被访问的时间,Nginx被访问的次数
	if (( ${IP[$i]} >= 10 ));then
		echo "$i ${IP[$i]}"
	fi
done

批量处理文本信息

需求:以第一行为例,ip 地址 10.171.112.10 替换成 10.101.100.1 (批量替换)

vim abc_hosts
[all:vars]
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
ansible_become=false
ansible_user='haha'
ansible_password='xixi'

[capitastar3.0_prod_windows]
10.101.100.1   node01 ansible_host='10.171.112.10' environments='PROD'
10.101.100.2   node02 ansible_host='10.171.112.10' environments='PROD'
10.101.100.3   node03 ansible_host='10.171.112.10' environments='PROD'

脚本

#!/bin/bash
while read line
do
        abc=`echo $line | grep ^10 | awk '{print $1}'`
        echo $line | sed -r "s/10.171.112.10/$abc/g" >> abc.txt
done<abc_hosts

执行结果

cat abc.txt
[all:vars]
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
ansible_become=false
ansible_user='haha'
ansible_password='xixi'

[capitastar3.0_prod_windows]
10.101.100.1   node01 ansible_host='10.101.100.1' environments='PROD'
10.101.100.2   node02 ansible_host='10.101.100.2' environments='PROD'
10.101.100.3   node03 ansible_host='10.101.100.3' environments='PROD'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值