1.MySQL中出现存SWAP,主要会是哪些原因?
--物理内存切实不足
--numa导致内存分配不均,出现物理内存未使用完,就出现大量swap的使用
2.MySQ中CPU负载很高,是什么原因?给出查找的步骤及解决思路?
推荐Linux操作系统
主机及操作系统 $ uname -a
Linux MyDB1 2.6.32-504.23.4.el6.x86_64 #1 SMP Tue Jun 9 20:57:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
内核版本 $ cat /proc/version
Linux version 2.6.32-504.23.4.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version
4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) ) #1 SMP Tue Jun 9 20:57:37 UTC 2015
发行版本 $ cat /etc/issue
CentOS release 6.6 (Final)
Kernel
on an m
设定主机名
vim /etc/sysconfig/network
HOSTNAME=XXX(按照命名规范)/idc_name_035076_mysql_idc.baidu.com
设定时区
vim /etc/sysconfig/clock
ZONE=Asia/Shanghai
UTC=false
ARC=false
rm /etc/localtime
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
设定NTP同步
ntpdate 182.92.12.11
sudo crontab -l
0 * * * * /usr/sbin/ntpdate 192.168.50.21; hwclock -w 1>/dev/null 2>&1
30 23 * * * /usr/sbin/ntpdate 192.168.50.22; hwclock -w 1>/dev/null 2>&1
关闭 SELinux
# sestatus
# setenforce 0
# getenforce
删除操作系统多余组
删除操作系统多余账户
清理不需要的服务
设置口令有效期
vim /etc/login.defs文件,修改如下行
将PASS_MAX_DAYS值设置为90(天)
PASS_MAX_DAYS 99999
设置密码复杂度
vim /etc/pam.d/login
增加如下内容
password required pam_cracklib.so difok=5 dcredit=-1 retry=1
新密码与旧密码必须有5个不同字符
必须有一个数字
一次失败后passwd程序返回错误信息
设置缺省密码长度限制
vim /etc/login.defs文件,修改如下行
? vim /etc/login.defs
? 把下面这行
? PASS_MIN_LEN 5 改为
? PASS_MIN_LEN 8
SSH安全配置
vim /etc/ssh/sshd_config
Procotol 2(强制使用协议)
PermitRootLogin no(不允许root远程登录)
给用户sudo权限
[root@mysql1 ~]# chmod u+w /etc/sudoers #添加文件的写权限
[root@mysql1 ~]# vim /etc/sudoers
"root ALL=(ALL) ALL"在起下面添加"mysql ALL=(ALL) ALL
[root@mysql1 ~]# chmod u-w /etc/sudoers #撤销文件的写权限
设置历史命令记录增加时间戳
vim /etc/profile
在文件中增加如下内容:
HISTTIMEFORMAT="%Y:%M:%D %H-%m-%s"
export=HISTTIMEFORMAT
chmod 600 用户当前目录下.bash_history(修改文件权限)
防止rm误删文件
alias
[root@mysql1 ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
设置系统启动时运行等级
编辑/etc/inittab文件:
id:5:initdefault:改为:id:3:initdefault:
? 注:5为带X-Windows桌面系统的运行级别,3为多用户运行级别。
内核参数优化
# vim /etc/sysctl.conf
fs.file-max=655350
kernel.shmmax
kernel.shmall
vm.swappiness =10
ulimit参数优化
# vim /etc/security/limits.conf
mysql soft nproc 65535
mysql hard nproc 65535
mysql soft nofile 65535
mysql hard nofile 65535
##mysql hard memlock unlimited
##mysql soft memlock unlimited
调整操作系统预读
df -Th
[root@mysql1 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_mysql1-lv_root
ext4 50G 15G 33G 31% /
tmpfs tmpfs 1004M 76K 1004M 1% /dev/shm
/dev/sda1 ext4 485M 55M 405M 12% /boot
/dev/mapper/vg_mysql1-lv_home
ext4 45G 1.2G 42G 3% /home
[root@mysql1 ~]# cat /sys/block/sda/queue/read_ahead_kb
128-->>16
这个参数默认是128,没有准确的答案,针对不同的应用场景有不同的合理值,这个不大适合统一标准化,知道就好
调整CPU亲和性
#该参数Centos 6.x有,默认是0(6.3) 1(6.4+),调整CPU亲和性, 确保每个io都被其发起的
CPU处理
[root@hongquan1 mapper]# more /sys/block/sda/queue/rq_affinity
1
? 设置为1,表示io请求来自于哪一个cpu node,完成就返回这个node,设置为2,具体到是那个
cpu发起,就原路返回,比较好的分散到各个cpu,且减少cpu之间的循环
#rotational、 read_ahead_kb、 rq_affinity参数的调整对SSD硬盘性能几乎没有影响,建议使用默认配置,
没遇到跟该参数有关的问题
--cpu节能模式--关闭
#vi /etc/powersave/cpufreq
CPUFREQ_ENABLED=”no”
重启/etc/init.d/powersave即可
提高调度器请求队列
Fusion-io默认是1024,Shannon-io默认是128
[root@mysql1 ~]# more /sys/block/sda/queue/nr_requests
128
#当有较大的io压力时,能减小系统load和提高IO吞吐量
[root]# vim /sys/block/dfa/queue/nr_requests
4096
我们的生产环境
这个就保持默认就好,没遇到跟该参数有关的问题,SSD下改了不会有很大区别
关闭透明大内存页动态管理
#永久关闭,就将下面的命令写入到/etc/rc.local文件中
echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled
echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag
[root@mysql1 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
NUMA使用规则
关闭NUMA,对SSD硬盘性能提高较大
统一关闭NUMA
mysql启动脚本修改为 sudo /usr/bin/numactl --interleave=all
$MYSQL_BASE/bin/mysqld_safe --defaults-file=$MYSQL_CONF/mysql.cnf
Linux网络优化
#ringbuffer设置为最大的4096
? /sbin/ethtool -G eth0 tx 4096
? /sbin/ethtool -G eth1 rx 4096
? #这个功能原本是为了在多队列网卡下做流量hash的。我们过去的网卡驱动因为版本问题没这个功
能,但这台机器的网
? 卡驱动还是芯片问题默认开启了这个功能,但没有设过相应的buffer所以容易出现丢包。 (ethtool
-S eth0 | grep fdir
? 可以看到很多overflow是这个造成的),这个功能对后端没用,应当关闭
? /sbin/ethtool -K eth0 ntuple off
? /sbin/ethtool -K eth1 ntuple off
磁盘调度算法设置
#Flash卡
Fusion厂商使用 noop;Shannon厂商屏蔽了用户不可设置,使用noop
IO调度算法设置为noop ,因为IO调度算法采用Deadline和Noop性能差距不大,Noop调度算法
性能略高于Deadline;
?#SAS盘
echo "deadline" >/sys/block/sdb/queue/scheduler
#SSD推荐noop,其它推荐deadline
禁用设备轮转
2.6.29内核以后,linux就自动判断是SSD还是HDD,通过如下参数可以得知,除非有人为更改,0
是SSD,1是HDD
[root@mysql1 ~]# cat /sys/block/sda/queue/rotational
1
文件系统优化
##xfs在大多数场景下整体IOPS表现还是要比ext4来得更高、更稳定,延迟也更小。
采用XFS文件系统, mount with noatime
#格式化标准命令
mkfs.xfs -f -i attr=2 -l lazy-count=1,sectsize=4096 -b size=4096 -d sectsize=4096 -L data /dev/sda1
#mount标准命令
mount -o rw,noatime,nodiratime,noikeep,nobarrier,allocsize=100M,attr2,largeio,inode64,swalloc
/dev/sda1 /apps
----
1、使用 deadline/noop这两种I/O调度器,千万别用 cfq (它不适合跑DB类服务);
2、使用xfs文件系统,千万别用ext3;ext4勉强可用,但业务量很大的话,则一定要用xfs;
3、文件系统mount参数中增加:noatime, nodiratime, nobarrier几个选项(nobarrier是xfs文件系统特有的);
1、将vm.swappiness设置为5-10左右即可,甚至设置为0(RHEL 7以上则慎重设置为0,除非你允许OOM kill发生),以降低使用SWAP的机会;
2、将vm.dirty_background_ratio设置为5-10,将vm.dirty_ratio设置为它的两倍左右,以确保能持续将脏数据刷新到磁盘,避免瞬间I/O写,产生严重等待(和MySQL中的innodb_max_dirty_pages_pct类似);
3、将net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse都设置为1,减少TIME_WAIT,提高TCP效率;
4、至于网传的read_ahead_kb、nr_requests这两个参数,我经过测试后,发现对读写混合为主的OLTP环境影响并不大(应该是对读敏感的场景更有效果),不过没准是我测试方法有问题,可自行斟酌是否调整;