服务器问题
因为服务器 采用的samba和ssh 方式登录,但是在人数过多的情况下,文件读写会出现卡顿,不定时出现个别用户,或者群体范围,经查阅资料,检查cpu 和 mem 使用情况,主要原因出现 cache/buff 过高的情况
首先检查下 cpu 和 mem 使用信息
主要是top信息
#iP地址
IP=`ifconfig | grep inet | grep -vE 'inet6|127.0.0.1' | awk '{print $2}'`
echo "IP地址:"$IP
# 获取cpu总核数
cpu_num=`grep -c "model name" /proc/cpuinfo`
echo "cpu总核数:"$cpu_num
# 1、获取CPU利用率
################################################
#us 用户空间占用CPU百分比
#sy 内核空间占用CPU百分比
#ni 用户进程空间内改变过优先级的进程占用CPU百分比
#id 空闲CPU百分比
#wa 等待输入输出的CPU时间百分比
#hi 硬件中断
#si 软件中断
#################################################
# 获取用户空间占用CPU百分比
cpu_user=`top -b -n 1 | grep Cpu | awk '{print $2}' | cut -f 1 -d "%"`
echo "用户空间占用CPU百分比:"$cpu_user
# 获取内核空间占用CPU百分比
cpu_system=`top -b -n 1 | grep Cpu | awk '{print $4}' | cut -f 1 -d "%"`
echo "内核空间占用CPU百分比:"$cpu_system
# 获取空闲CPU百分比
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $8}' | cut -f 1 -d "%"`
echo "空闲CPU百分比:"$cpu_idle
# 获取等待输入输出占CPU百分比
cpu_iowait=`top -b -n 1 | grep Cpu | awk '{print $10}' | cut -f 1 -d "%"`
echo "等待输入输出占CPU百分比:"$cpu_iowait
#2、获取CPU上下文切换和中断次数
# 获取CPU中断次数
cpu_interrupt=`vmstat -n 1 1 | sed -n 3p | awk '{print $11}'`
echo "CPU中断次数:"$cpu_interrupt
# 获取CPU上下文切换次数
cpu_context_switch=`vmstat -n 1 1 | sed -n 3p | awk '{print $12}'`
echo "CPU上下文切换次数:"$cpu_context_switch
#3、获取CPU负载信息
# 获取CPU15分钟前到现在的负载平均值
cpu_load_15min=`uptime | awk '{print $11}' | cut -f 1 -d ','`
echo "CPU 15分钟前到现在的负载平均值:"$cpu_load_15min
# 获取CPU5分钟前到现在的负载平均值
cpu_load_5min=`uptime | awk '{print $10}' | cut -f 1 -d ','`
echo "CPU 5分钟前到现在的负载平均值:"$cpu_load_5min
# 获取CPU1分钟前到现在的负载平均值
cpu_load_1min=`uptime | awk '{print $9}' | cut -f 1 -d ','`
echo "CPU 1分钟前到现在的负载平均值:"$cpu_load_1min
# 获取任务队列(就绪状态等待的进程数)
cpu_task_length=`vmstat -n 1 1 | sed -n 3p | awk '{print $1}'`
echo "CPU任务队列长度:"$cpu_task_length
#4、获取内存信息
# 获取物理内存总量
mem_total=`free | grep Mem | awk '{print $2}'`
echo "物理内存总量:"$mem_total
# 获取操作系统已使用内存总量
mem_sys_used=`free | grep Mem | awk '{print $3}'`
echo "已使用内存总量(操作系统):"$mem_sys_used
# 获取操作系统未使用内存总量
mem_sys_free=`free | grep Mem | awk '{print $4}'`
echo "剩余内存总量(操作系统):"$mem_sys_free
# 获取应用程序已使用的内存总量
mem_user_used=`free | sed -n 3p | awk '{print $3}'`
echo "已使用内存总量(应用程序):"$mem_user_used
# 获取应用程序未使用内存总量
mem_user_free=`free | sed -n 3p | awk '{print $4}'`
echo "剩余内存总量(应用程序):"$mem_user_free
# 获取交换分区总大小
mem_swap_total=`free | grep Swap | awk '{print $2}'`
echo "交换分区总大小:"$mem_swap_total
# 获取已使用交换分区大小
mem_swap_used=`free | grep Swap | awk '{print $3}'`
echo "已使用交换分区大小:"$mem_swap_used
# 获取剩余交换分区大小
mem_swap_free=`free | grep Swap | awk '{print $4}'`
echo "剩余交换分区大小:"$mem_swap_free
#5、获取磁盘I/O统计信息
echo "指定设备(/dev/sda)的统计信息"
# 每秒向设备发起的读请求次数
disk_sda_rs=`iostat -kx | grep sda| awk '{print $4}'`
echo "每秒向设备发起的读请求次数:"$disk_sda_rs
# 每秒向设备发起的写请求次数
disk_sda_ws=`iostat -kx | grep sda| awk '{print $5}'`
echo "每秒向设备发起的写请求次数:"$disk_sda_ws
# 向设备发起的I/O请求队列长度平均值
disk_sda_avgqu_sz=`iostat -kx | grep sda| awk '{print $9}'`
echo "向设备发起的I/O请求队列长度平均值"$disk_sda_avgqu_sz
# 每次向设备发起的I/O请求平均时间
disk_sda_await=`iostat -kx | grep sda| awk '{print $10}'`
echo "每次向设备发起的I/O请求平均时间:"$disk_sda_await
# 向设备发起的I/O服务时间均值
disk_sda_svctm=`iostat -kx | grep sda| awk '{print $11}'`
echo "向设备发起的I/O服务时间均值:"$disk_sda_svctm
# 向设备发起I/O请求的CPU时间百分占比
disk_sda_util=`iostat -kx | grep sda| awk '{print $12}'`
echo "向设备发起I/O请求的CPU时间百分占比:"$disk_sda_util
clean buf
#!/bin/bash
if [ ! -d "./log/" ];then
mkdir ./log
fi
if [ ! -f "./log/mem.log" ];then
touch ./log/mem.log
fi
echo "==========================================================" >> ./log/mem.log
used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`
share=`free -m | awk 'NR==2' | awk '{print $5}'`
buff_cache=`free -m | awk 'NR==2' | awk '{print $6}'`
date >> ./log/mem.log
echo "Memory usage before free [Use:${used}MB][Free:${free}MB][buff_cache:${buff_cache}MB][Free:${free}MB] " >> ./log/mem.log
echo "begin to clean ==>" >> ./log/mem.log
sync;sync;sync # write to hardware
sleep 10 #delay for write
echo "passwd" | sudo -S sh -c "echo 1 > /proc/sys/vm/drop_caches"
echo "passwd" | sudo -S sh -c "echo 2 > /proc/sys/vm/drop_caches"
echo "passwd" | sudo -S sh -c "echo 3 > /proc/sys/vm/drop_caches"
ok_used=`free -m | awk 'NR==2' | awk '{print $3}'`
ok_free=`free -m | awk 'NR==2' | awk '{print $4}'`
ok_share=`free -m | awk 'NR==2' | awk '{print $5}'`
ok_buff_cache=`free -m | awk 'NR==2' | awk '{print $6}'`
date >> ./log/mem.log
echo "Memory usage after free [Use:${ok_used}MB][Free:${ok_free}MB][buff_cache:${ok_buff_cache}MB][Free:${ok_free}MB] " >> ./log/mem.log
echo "clean end <== " >> ./log/mem.log
echo " " >> ./log/mem.log
设置开机启动程序
- sudo vim /etc/systemd/system/mem.monitor.service
[Unit]
Description=/etc/mem_monitor server # 服务的简单描述
After=network.target auditd.service # 定义启动顺序
ConditionPathExists=/etc/mem_monitor
[Service]
Type=simple
ExecStart=/etc/mem_monitor start #指定启动脚本的地址
TimeoutSec=0
Restart=on-failure
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
[Unit]
Description : 服务的简单描述
Documentation : 服务文档
Before、After:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。
Requires:这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,这个单元也停止了。
Wants:推荐使用。这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元没有影响。
[Service]
Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。
PIDFile:pid文件路径
ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
ExecReload:指定单元停止时执行的命令或者脚本。
ExecStop:指定单元停止时执行的命令或者脚本。
PrivateTmp:True表示给服务分配独立的临时空间
Restart:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。
RemainAfterExit:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。
[Install]
Alias:为单元提供一个空间分离的附加名字。
RequiredBy:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。
WantBy:单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。
Also:指出和单元一起安装或者被协助的单元。
DefaultInstance:实例单元的限制,这个选项指定如果单元被允许运行默认的实例。
- sudo vim /etc/mem_monitor
#!/bin/bash
PATH_LOG=/home/ubt01/log/mem.log
echo "log redirect to $PATH_LOG"
echo " " >> $PATH_LOG
echo "==========================================================" >> $PATH_LOG
while :
do
echo "sleep 30 min " >> $PATH_LOG
sleep 30m
echo "after 30 min" >> $PATH_LOG
cur_time_begin=$(date "+%Y-%m-%d %H:%M:%S")
echo "${cur_time_begin}" >> $PATH_LOG
used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`
share=`free -m | awk 'NR==2' | awk '{print $5}'`
buff_cache=`free -m | awk 'NR==2' | awk '{print $6}'`
echo "Memory usage before free [Used:${used}MB][shared:${share}MB][buff_cache:${buff_cache}MB][Free:${free}MB]" >> $PATH_LOG
cur_time_end=$(date "+%Y-%m-%d %H:%M:%S")
echo "${cur_time_end}" >> $PATH_LOG
if [ ${buff_cache} -lt 4096 ];then
echo "buf_cache:${buff_cache} < 4096M judging " >> $PATH_LOG
continue
fi
echo "buf_cache:${buff_cache} > 4096M do clean " >> $PATH_LOG
echo "begin to clean ==>" >> $PATH_LOG
sync;sync;sync # write to hardware
sleep 10 #delay for write
echo "passwd" | sudo -S sh -c "echo 1 > /proc/sys/vm/drop_caches"
echo "passwd" | sudo -S sh -c "echo 2 > /proc/sys/vm/drop_caches"
echo "passwd" | sudo -S sh -c "echo 3 > /proc/sys/vm/drop_caches"
ok_used=`free -m | awk 'NR==2' | awk '{print $3}'`
ok_free=`free -m | awk 'NR==2' | awk '{print $4}'`
ok_share=`free -m | awk 'NR==2' | awk '{print $5}'`
ok_buff_cache=`free -m | awk 'NR==2' | awk '{print $6}'`
cur_time_end=$(date "+%Y-%m-%d %H:%M:%S")
echo "${cur_time_end}" >> $PATH_LOG
echo "Memory usage before free [Used:${ok_used}MB][shared:${ok_share}MB][buff_cache:${ok_buff_cache}MB][Free:${ok_free}MB]" >> $PATH_LOG
echo "clean end <== " >> $PATH_LOG
done
sudo systemctl daemon-reload
sudo systemctl enable mem_monitor.service
sudo systemctl start mem_monitor.service
命令介绍:
启动一个服务:systemctl start nginx.service
关闭一个服务:systemctl stop postfix.service
重启一个服务:systemctl restart nginx.service
显示一个服务的状态:systemctl status postfix.service
在开机时启用一个服务:systemctl enable nginx.service
在开机时禁用一个服务:systemctl disable nginx.service
查看服务是否开机启动:systemctl is-enabled nginx.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl --failed
定时执行
cron是一个Linux定时执行工具
sudo crontab -e
最后一行添加 凌晨3点执行脚本
00 03 * * * root /root/mem_monitor.sh
查询
sudo crontab -l