直接分享干货!供大家参考,欢迎提出更好的建议,学习是无止境的,总结更是一种过程美的体现。



关于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