远程服务器维护

服务器问题

因为服务器 采用的samba和ssh 方式登录,但是在人数过多的情况下,文件读写会出现卡顿,不定时出现个别用户,或者群体范围,经查阅资料,检查cpu 和 mem 使用情况,主要原因出现 cache/buff 过高的情况
buf/cache

首先检查下 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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值