因爲佔用太多服務器swap內存發現的MySQL相關的性能問題

查看佔用服務器要多swap內存的進程命令:html

for i in $( cd /proc;ls |grep "^[0-9]"|awk ' $0 >100') ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps 2>/dev/null ; done | sort -k2nr | head -10

能夠看到pid=18906的這個常常 佔用了最多的swap
而後 咱們查找 這個pid具體是哪一個進程
使用命令
ps -ef|grep 18906mysql

生產數據庫服務器的swap資源被佔用了100% 致使 memery一直高負載
1.cd /proc 找到資源佔用最大的進程發現是 mysqllinux

經過mysql服務重啓 能夠釋放swap佔用的資源(線上的MySQL是不容許隨便重啓的)sql

同時在my.cnf中配置參數
innodb_flush_method=O_DIRECT數據庫

能夠有效的繞過swap的陷阱
由於設置innodb_flush_method=O_DIRECT 能夠繞過linux 自己的緩存機制,直接使用mysql的緩存緩存

參考文檔:
對innodb_flush_method的一點解釋
http://blog.itpub.net/7728585/viewspace-1980262/
列出swap交換內存中的服務詳情
https://www.affdalao.com/1078.htmlbash

附腳本內容:服務器

#!/bin/bash
SUM=0
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"`
do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
for SWAP in `grep Swap $DIR/smaps 2>/dev/null | awk '{ print $2 }'`
do
let SUM=$SUM+$SWAP
done
if (( $SUM > 0 )); then
echo "PID=$PID swapped $SUM KB ($PROGNAME)"
fi
let OVERALL=$OVERALL+$SUM
SUM=0
done
echo "Overall swap used: $OVERALL KB"

##查看佔用swap內存最多的進程
## for i in $( cd /proc;ls |grep "^[0-9]"|awk ' $0 >100') ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps 2>/dev/null ; done | sort -k2nr | head -10