cpu飙升排查思路
- 先排查进程的cpu占比
R:运行状态 S:睡眠状态
排查一些短频快的进程,(例如写一个计划任务,每个0.01秒运行一次)查看计划任务有无异常等
- 排查硬盘的io,(io本身并不占用cup资源,但是io行为需要cpu下发指令)
- cpu有可能一直在下发io指令;ps aux | grep “D+”
D+表示不可能中断状态(硬盘忙不过来,cpu一直在下发io指令)- iostat 1 3
每个1秒刷一次,刷3次,查看%iowait(cpu在执行io命令时的占比)- 查看swap分区,查看当前系统是否过多占用swap分区
cat /proc/sys/vm/swappiness ;值一般0-100之间(一般调整在10左右),值越大越是尽可能的占用swap分区
- 查看日志信息,判断该服务器是否正在被人攻击
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'