直接分享干货!供大家参考,欢迎提出更好的建议,学习是无止境的,总结更是一种过程美的体现。
关于RHEL6中ulimit的nproc限制
root@test-mysql ~]# cat /etc/security/limits.d/90-nproc.conf
* soft nproc 32000
* hard nproc 32000
root soft nproc unlimited
* soft nofile 32000
* hard nofile 40960
ulimit的优化
cat /etc/security/limits.conf
* soft nproc 2047
* hard nproc 16384
* soft nofile 10240
* hard nofile 65536
* soft stack 4096 每个线程连接使用内存大小,默认为10m,可以使用ulimit -n 查看;
首先通过优化连接池,然后通过修改内核的stack size值,从默认的10M修改到4M,使连接占用的内存大大减少。
如果是普通用户添加:
@mgousr03 soft nofile 1048576
@mgousr03 hard nofile 1048576
@mgousr03 soft nproc 1048576
@mgousr03 hard nproc 1048576
连接mongodb有时候会有警告:处理方式 执行:
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
预读值设置
预读值文件操作系统的一个优化手段,大致就是在程序请求读取一个页面的时候,文件系统会同时读取下面的几个页面并返回;这原因是因为很多时候IO最费时的磁盘寻道。通过预读,系统可以提前把紧接着的数据同时返回。假设程序是在做一个连续读的操作,那么这样可以节省很多磁盘寻道时间。
MongoDB很多时候会做随机访问。对于随机访问,这个预读值应该设置的较小尾号,一般来说32是一个不错的选择。
readahead调小点;如果太大会有很多在cache(SSD都直接降到8)
blockdev --getra /dev/sda3 得到磁盘预读值大小 默认为256
blockdev --setra 32 /dev/sd3 设置预读值为32
# ps aux | awk 'NR==1||/mongo/'
内核的tcp优化
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_wmem = 8192 436600 873200
net.ipv4.tcp_rmem = 32768 436600 873200
net.ipv4.tcp_mem = 94500000 91500000 92700000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_fin_timeout = 30
vm.swappiness = 5
#直接生效
/sbin/sysctl -p
系统优化--NUMA
在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30%;
在bios层面numa关闭是,无论os层面的numa是否打开,都不会影响性能。
系统优化--网卡
RSS: Receive Side Scaling。网卡多队列,需要硬件支持。网卡接收到网络数据包之后,要发送一个硬件中断,通知CPU取数据包。默认配置,都是由CPU0去做。
RPS: Receive Packet Steering。向某CPU发送一个软中断,来接收数据包,并递交给应用程序。
RFS: Receive Flow Steering。维护两张hash表,实现将软中断分散到多颗CPU去处理。
结论
减少CPU之间的cache交互; hash计算精准定位到目标CPU。
CPU空闲时,RT性能优化; CPU忙碌时,RT反而恶化。
RFS的hash表条数对性能有较大影响。
系统优化--内存插法
6根内存在4通道里的插法为:2/2/1/1,简称42插法
6根内存在4通道里的插法为:2/2/2/0,简称33插法
HP/DELL/华为/英业达对比:
HP/DELL/华为保持42插法性能会比33插法性能高。NUMA开启,QPS提升8-20%;NUMA关闭,QPS值能提升12-38%。
测试磁盘读写
[root@mongodb134 home]# dd if=/dev/zero of=img bs=1K count=4K oflag=dsync
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 6.6375 s, 632 kB/s
[root@mongodb134 home]# cd /data/
[root@mongodb134 data]# dd if=/dev/zero of=img bs=1K count=4K oflag=dsync
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 1.79243 s, 2.3 MB/s
[root@mongodb134 data]# dd if=/dev/zero of=img bs=1K count=4K oflag=dsync
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 1.78156 s, 2.4 MB/s
[root@mongodb134 data]# dd if=/dev/zero of=img bs=1K count=4K oflag=dsync
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 1.91045 s, 2.2 MB/s
[root@mongodb134 data]# dd if=/dev/zero of=img bs=1K count=4K oflag=dsync
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 1.6511 s, 2.5 MB/s
[root@mongodb134 data]# cd /home/
[root@mongodb134 home]# dd if=/dev/zero of=img bs=1K count=4K oflag=dsync
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 2.18695 s, 1.9 MB/s
[root@mongodb134 home]# dd if=/dev/zero of=img bs=1K count=4K oflag=dsync
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 2.49997 s, 1.7 MB/s
[root@mongodb134 home]# dd if=/dev/zero of=img bs=1K count=4K oflag=dsync
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 2.33217 s, 1.8 MB/s
[root@mongodb134 home]# dd if=/dev/zero of=img bs=1K count=4K oflag=dsync
4096+0 records in
4096+0 records out
4194304 bytes (4.2 MB) copied, 2.53745 s, 1.7 MB/s
[root@mongodb134 home]#
注:dd只能提供一个大概的测试结果,而且是连续IO 而不是随机IO
1. 首先用自带的dd命令先测一下, 块大小为8k
# time dd if=/dev/sda2 of=/dev/null bs=8k count=8388608
8388608+0 records in
8388608+0 records out
68719476736 bytes (69 GB) copied, 516.547 seconds, 133 MB/s
real 8m36.926s
user 0m0.117s sys
0m55.216s #因为/dev/sda2是一个物理分区,对它的读取会产生IO,/dev/null是伪设备,相当于黑洞,of
到该设备不会产生IO,所以,这个命令的IO只发生在/dev/sdb1上,也相当于测试磁盘的读能力。
读测试
# time dd if=/dev/sda2 of=/dev/null bs=8k count=8388608
8388608+0 records in
8388608+0 records out
68719476736 bytes (69 GB) copied, 516.547 seconds, 133 MB/s
real 8m36.926s
user 0m0.117s sys
0m55.216s #因为/dev/sda2是一个物理分区,对它的读取会产生IO,/dev/null是伪设备,相当于黑洞,of
到该设备不会产生IO,所以,这个命令的IO只发生在/dev/sdb1上,也相当于测试磁盘的读能力。
写测试
# time dd if=/dev/zero f=/opt/iotest bs=8k count=8388608
8388608+0 records in
8388608+0 records out
68719476736 bytes (69 GB) copied, 888.398 seconds, 77.4 MB/s
real 14m48.743s
user 0m3.678s sys 2m47
.158s #因为/dev/zero是一个伪设备,它只产生空字符流,对它不会产生IO,所以,IO都会集中在of
文件中,of文件只用于写,所以这个命令相当于测试磁盘的写能力。
读写测试
# time dd if=/dev/sda2 f=/opt/iotest bs=8k count=8388608
8388608+0 records in
8388608+0 records out
68719476736 bytes (69 GB) copied, 1869.89 seconds, 36.8 MB/s
real 31m10.343s
user 0m2.613s sys 3m25.548s