服务器优化

服务器优化

cpu,内存,磁盘,网卡

服务器选型

--少核高频,向多核低频的发展趋势明显
--ddr4内存的普及,起始频率妖上更高的台阶
--ssd硬盘使用越来越多,NVMe蓄势待发
--万兆更普及,万兆条线重新选型

DB服务器标准化配置
2*E5 2690 V3/128 GB

CPU优化

cpu架构,物理硬件,在操作系统看来
cpu生产环境,cpu多进程,多线程,cpu调度器
#lscpu
#cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c


内存优化


numa(non uniform memory access)
numa架构内存分配不均
#numactl --hardware
free内存有8个G,但节点0只有314M free内存,内存分配非常不平均,当mysql需要大量free内存时,就会出现竞争
解决free内存不足和numa架构内存分配不均
1 .保证系统有足够多free内存,这个可以通过设置内存参数
vm.min_free_kbytes = NNNNN --当系统free内存少于这个时,内核会启动回收内存,进程在分配内存时也会启动回收内存
vm.extra_free_kbytes = NNNNN --当系统free内存少于这个时,内核会从pagecache回收内存(用户进程不会回收内存)
--其他
[root@hongquan1 3306]# cat /proc/sys/vm/panic_on_oom
0
vm.panic_on_oom 默认为0开启 为1时表示关闭此功能
等于0时,表示当内存耗尽时,内核会触发OOM killer杀掉最耗内存的进程
当OOM Killer被启动时,通过观察进程自动计算得出各当前进程的得分 /proc/<PID>/oom_score,分值越高越容易被kill掉
而且计算分值时主要参照 /proc/<PID>/oom_adj , oom_adj 取值范围从-17到15,当等于-17时表示在任何时候此进程都不会被 oom killer kill掉(适用于mysql)
/proc/[pid]/oom_adj ,该pid进程被oom killer杀掉的权重,介于 [-17,15]之间,越高的权重,意味着更可能被oom killer选中,-17表示禁止被kill掉。
/proc/[pid]/oom_score,当前该pid进程的被kill的分数,越高的分数意味着越可能被kill,这个数值是根据oom_adj运算后的结果,是oom_killer的主要参考。
sysctl 下有2个可配置选项:
vm.panic_on_oom = 0 #内存不够时内核是否直接panic
  vm.oom_kill_allocating_task = 1 #oom-killer是否选择当前正在申请内存的进程进行kill

2 在突然大量连接到来之前保留足够free内存
3. 采用交叉内存分配模式启动mysql或其它需要大内存的系统,保持多个节点之间内存分配平衡numactl --interleave all 《command》
4. 优化mysql的%buffer%等参数内存分配,避免过大不合理参数
关闭numa
grep -i numa /var/log/dmesg #如何判断一个多核机器linux是否为numa结构
[root@mysql1 soft]# grep -i numa /var/log/dmesg
[ 0.000000] NUMA: Initialized distance table, cnt=4

单机单实例,建议关闭numa
--bios中关闭
--os内核,启动是设置numa=off
--mysql启动时候,关闭numa特性 --interleave all
numactl --interleave=all /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/mysqldata/3306/my.cnf &

mysql 5.6.27,5.7.9有参数innodb_numa_interleave=OFF/ON
多实例可以用numa,多实例用偶数,提供内存效率
内存插法:2/2/1/1,2/2/2/0

----http://imysql.com/2015/05/24/mysql-optimization-reference-1.shtml
1、选择Performance Per Watt Optimized(DAPC)模式,发挥CPU最大性能,跑DB这种通常需要高运算量的服务就不要考虑节电了;
2、关闭C1E和C States等选项,目的也是为了提升CPU效率;
3、Memory Frequency(内存频率)选择Maximum Performance(最佳性能);
4、内存设置菜单中,启用Node Interleaving,避免NUMA问题;
---

IO优化


--磁盘的访问模式
顺序访问性能较好100M/S,磁盘吞吐率
随机访问性能较差,iops较低
io per second
机械硬盘:100~200
固态硬盘:50000+
--磁盘的分类
SATA II 机械磁盘 7200 RPM IOPS: ~100
SAS 机械磁盘15K RPM IOPS: ~200
SSDIOPS: ~50000+
提升iops性能手段
RAID技术--功耗高
购买共享存储设备--价格高
RAID卡
1、 查看电量百分比
# megacli-AdpBbuCmd-GetBbuStatus-aALL|grep"Relative State of Charge"
2、 查看充电状态
# megacli-AdpBbuCmd-GetBbuStatus-aALL|grep"Charger Status"
查看缓存策略
[root@test_raid~]#megacli-LDGetProp-Cache-LALL-a0
Adapter0-VD0(targetid:0):CachePolicy:WriteBack,ReadAdaptive,Direct,NoWriteCacheifbadBBU
SSD选择
PCIE or SATA
SATA益于安装与升级
SATA与PCIE的性能差距逐渐缩小
PCIE的性能很少有应用可以完全使用
优先选择SATA接口的SSD
SSD品牌推荐
Intel
Fusion IO
宝存
#lspci -nn |grep -i mass
SSD与数据库优化
磁盘调度算法设置为:deadline或者noop
InnoDB存储引擎参数设置
innodb_flush_neighbors=0
innodb_log_file_size=4G
查看ssd
# cat /sys/block/sda/queue/rotational
1 --hdd,0--sdd
# grep ^ /sys/block/*/queue/rotational
#lsblk -d -o name,rota
----
1、使用SSD或者PCIe SSD设备,至少获得数百倍甚至万倍的IOPS提升;
2、购置阵列卡同时配备CACHE及BBU模块,可明显提升IOPS(主要是指机械盘,SSD或PCIe SSD除外。同时需要定期检查CACHE及BBU模块的健康状况,确保意外时不至于丢失数据);
3、有阵列卡时,设置阵列写策略为WB,甚至FORCE WB(若有双电保护,或对数据安全性要求不是特别高的话),严禁使用WT策略。并且闭阵列预读策略,基本上是鸡肋,用处不大;
4、尽可能选用RAID-10,而非RAID-5;
5、使用机械盘的话,尽可能选择高转速的,例如选用15KRPM,而不是7.2KRPM的盘,不差几个钱的;
----

网卡优化


bond网卡
mode=0(balance-rr)(平衡轮循策略)
特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环下去,
直到最后一个传输完毕
mode=4(802.3ad)(IEEE 802.3ad 动态链接聚合)

[root@mysql1 ~]# ethtool eth0
确认有无加载bonding模块
# lsmod | grep 'bonding'
# modprobe bonding
# lsmod | grep 'bonding'
配置bond0

1.CPU性能调优方法之一:把进程或线程绑定在单个CPU上,这可以增加进程的CPU缓存温度,提高它的内存I/O性能。
那么如何配置一个进程只跑在单个CPU上?
# apt-get install schedutils
# taskset -cp 1,2,3 2345
# taskset -c 1,2,3 /etc/init.d/mysql start
--
使用taskset命令指定某pid使用的cpu
如ps -ef|grep mysqld 查找出mysql进程的pid
taskset -p pid 查看当前使用的是哪个cpu
taskset -pc cpu'num pid 设置该进程使用哪个cpu
--
2.描述基于Linux中可用内存即将耗尽内核时为了释放更多内存会采取的步骤。
# free -m
#cat /proc/sys/vm/drop_caches
#sync ##使用sync命令,将系统缓存区中的脏数据写入磁盘中,包括已修改的i-node、已延迟的块I/O和读写映射文件
#echo 3 > /proc/sys/vm/drop_caches
##配置文件/proc/sys/vm/drop_caches中记录了缓存释放的参数,含义:默认0—不释放,1—释放pagecache,2—释放dentries和inodes,3—释放所有缓存
释放内存前先使用sync命令做同步,以确保文件系统的完整性,将所有未写的系统缓冲区写到磁盘中,
包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。

3.逻辑I/O和物理I/O有什么区别?
随机I/O和连续I/O有什么区别?
物理io是从读取文件,disk device,io channel,device driver
逻辑io是从读取内存,vol mgnt,buffer cache,file system
逻辑IO是操作系统发起的IO,这个数据可能会放在磁盘上,也可能会放在内存(文件系统的Cache)里。
物理IO是设备驱动发起的IO,这个数据最终会落在磁盘上。
逻辑IO和物理IO不是一一对应的。

随机io就是随机读取磁盘
顺序io就是顺序的读取磁盘
在随机 I/O 环境中(如用于数据库和通用文件服务器的环境),所有的磁盘都应花费相同的时间为 I/O 请求提供服务
例如,假设有 40 GB 存储用于数据库应用程序。如果跨四个 10 GB 的磁盘轴进行条带化,并且 I/O 是随机且均匀地分
散于卷中,则每个磁盘的繁忙程度一样,一般情况下会提高性能
磁盘上最大随机 I/O 性能的目标是 35% 或更低的使用率(由 iostat 命令报告)。通常,磁盘使用率超过 65% 就会
出现问题。磁盘使用率超过 90% 就会出现严重问题。解决磁盘使用率值太高的办法就是创建包含更多磁盘(轴)的新 RAID-0 卷。

可以在顺序 I/O 环境(如整表扫描占支配地位的 DBMS 服务器,以及数据非常密集的环境中的 NFS 服务器)中优化配
置的性能。要充分利用顺序 I/O 环境,请相对于一般 I/O 请求的大小将交错值设置为较小的值。

在顺序 I/O 环境中,查找时间和旋转时间实际上都为零。优化顺序 I/O 时,磁盘的内部传输率最为重要


4.描述一个网络接口工作超负荷会发生什么,包括对应用程序性能的影响。
网络接口超负荷,影响网络传输,程序响应缓慢,可能会超时等。


[root@fcbu.com ~]# free -m
total used free shared buffers cached
Mem: 7979 7897 82 0 30 3918
-/ buffers/cache: 3948 4031
Swap: 4996 438 4558

第一行用全局角度描述系统使用的内存状况:
total 内存总数
used 已经使用的内存数,一般情况这个值会比较大,因为这个值包括了cache 应用程序使用的内存
free 空闲的内存数
shared 多个进程共享的内存总额
buffers 缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
cached 缓存,用于已打开的文件

第二行描述应用程序的内存使用:
-buffers/cache 的内存数:used - buffers - cached
buffers/cache 的内存数:free buffers cached
前个值表示-buffers/cache 应用程序使用的内存大小,used减去缓存值
后个值表示 buffers/cache 所有可供应用程序使用的内存大小,free加上缓存值

第三行表示swap的使用:
used 已使用
free 未使用

可用的内存=free memory buffers cached。

为什么free这么小,是否关闭应用后内存没有释放?
但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的
第二行最后一个值:-/ buffers/cache: 3948 4031 ,这才是系统可用的内存大小。

实际项目中的经验告诉我们,如果因为是应用有像内存泄露、溢出的问题,从swap的使用情况是可以比较快速可以判断
的,但free上面反而比较难查看。我觉得既然核心是可以快速清空buffer或cache,但核心并没有这样做(默认值是0),我们不应该随便去改变它。

一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的,虽然看上去可能比较小。当发生内存不足、
应用获取不到可用内存、OOM错 误等问题时,还是更应该去分析应用方面的原因,如用户量太大导致内存不足、发生应
用内存溢出等情况,否则,清空buffer,强制腾出free的大小,可 能只是把问题给暂时屏蔽了,所以说一般情况下linux都不用经常手动释放内存

posted @ 2019-01-09 17:08  春困秋乏夏打盹  阅读(696)  评论(0编辑  收藏  举报