03搭建cdh 生产环境前的Linux 优化(涉及到Linux内存参数优化)

2019/3/20 星期三
搭建cdh 生产环境前的Linux 优化
1、先执行Linux 初始化脚本 (centos6 centos7 通用) sh initialization.sh
//注意执行脚本前,需要先设置一下hostname 并且需要配置一下免密登陆 执行完脚本后需要配置ntp服务,需要把主节点配置好/ect/hosts 然后scp下去--手动完成
见链接https://blog.51cto.com/12445535/2362407
//补充 cdh优化项禁止tuned 服务 见 https://blog.51cto.com/12445535/2368898

2、执行优化脚本中 的16 ssh优化 ;17 hbase优化 ;18步 19步 //针对hadoop集群的优化
//补充
预读缓冲
预读技术可以有效的减少磁盘寻道次数和应用的I/O等待时间,增加Linux文件系统预读缓冲区的大小(默认为256 sectors,128KB),可以明显提高顺序文件的读性能,建议调整到1024或2048 sectors。预读缓冲区的设置可以通过blockdev命令来完成。 具体操作见:cdh 之 HDFS集群优化篇003 https://blog.51cto.com/12445535/2368920
//补充
Linux文件系统保留记录访问每个文件的元数据。这意味着即使读取也会导致写入磁盘。为了加快文件读取速度,Cloudera建议您使用/ etc / fstab中的mount选项禁用此选项,称为atime:具体见链接 cdh官方文档看后小结(含优化项)001 https://blog.51cto.com/12445535/2368609
//补充
cloudera 官方建议:网络协议支持 CDH需要IPv4。不支持IPv6,必须禁用IPv6。
注意:请与操作系统供应商联系以获取有关禁用IPv6的帮
//补充
hostname:只能是以字母和数字的组合(中间允许’-‘),不能有“,” / ”.” / “_”等 特殊字符。官方建议最好不要包含大写字母

3、Linux虚拟内存(swap)调优篇-“swappiness”,“vm.dirty_background_ratio”和“vm.dirty_ratio更好的Linux磁盘缓存和性能 ”
https://www.cnblogs.com/yinzhengjie/p/9994207.html
(1)swap调优篇在initialization.sh 体现了
//临时改变方法:sysctl vm.swappiness=1 重启之后就会回到默认值
//永久调整swappiness的方法 echo "vm.swappiness=1" >> /etc/sysctl.conf 激活设置 sysctl -p
(2)使用vm.dirty_ratio和vm.dirty_background_ratio更好的Linux磁盘缓存和性能

[root@open-falcon-252-144 scripts]# sysctl -a | grep dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 30
vm.dirty_writeback_centisecs = 500

我们只需要关注
vm.dirty_background_ratio 和vm.dirty_ratio 这两个值
vm.dirty_background_ratio:是内存可以填充“脏数据”的百分比。这些“脏数据”在稍后是会写入磁盘的,pdflush/flush/kdmflush这些后台进程会稍后清理脏数据。举一个例子,我有32G内存,那么有3.2G的内存可以待着内存里,超过3.2G的话就会有后来进程来清理它。
//在后台刷新进程将脏页写入磁盘之前,可以减少脏页的数量,这个可以通过vm.dirty_backgroud_ratio设置为小于10的值来实现。改值指的是系统内存的百分比,大部分情况下设置为5就可以来。它不应该被设置为0,因为那样会促使内核频繁地刷新页面,从而降低内核为底层设备的磁盘写入提供缓冲的能力。
vm.dirty_ratio
//通过设置vm.dirty_ratio参数可以增加被内核进程刷新到磁盘之前的脏页数量,可以将它设置为大于20的值(这也是系统内存的百分比),这个值可设置的范围很广,60~80是个比较合理的区间。不过调整这个参数会带来一些风险,包括未刷新磁盘操作的数量和同步刷新引起的长时间I/O等待。
*大多数场景 减少Cache(虚拟机的典型应用) 大多数场景 ***
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
适合数据并不是很重要的场景,要求读写的效率想到高的场景
vm.dirty_background_ratio = 50
vm.dirty_ratio = 80
增减兼有(如果你部署kafka集群的话,我推荐使用这个方案,在《Kafka 权威指南》一书中,也有相关的记载哟!)
vm.dirty_background_ratio = 5
vm.dirty_ratio = 80
实际操作
echo "vm.dirty_background_ratio=5" >> /etc/sysctl.conf
echo "vm.dirty_ratio=80" >> /etc/sysctl.conf
sysctl -p
详细的内容介绍,见参考链接
小结:
vm.dirty_background_ratio 是什么?:也就是清理脏数据,比如我有32G内存,那么有3.2G的内存可以待着内存里,超过3.2G的话就会有后来进程来清理它。//也就是超过预定的空间就会有后来的进程清理他
vm.dirty_ratio 是什么?//是绝对的脏数据限制,内存里的脏数据百分比不能超过这个值。如果脏数据超过这个数量,新的IO请求将会被阻挡,直到脏数据被写进磁盘。这是造成IO卡顿的重要原因,但这也是保证内存中不会存在过量脏数据的保护机制。

[root@open-falcon-252-144 scripts]# cat /proc/vmstat |egrep "dirty|writeback"
nr_dirty 1166 //这个值就是说,我有1166页的脏数据要写到磁盘中
nr_writeback 0
nr_writeback_temp 0
nr_dirty_threshold 255860
nr_dirty_background_threshold 85286

4、Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小 https://www.cnblogs.com/yinzhengjie/p/9995756.html
一般在内网环境中,我们几乎是用不到IPV6,因此我们没有必要把多不用的功能开起来从而浪费不必要的资源。默认情况下,系统内核没有针对快速的的大流量网络传输进行优化,所以对于应用程序来说,一般需要对Linux系统的网络栈进行调优,以实现对大流量的支持。
[root@open-falcon-252-144 ~]# ifconfig
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.80.252.144 netmask 255.255.255.0 broadcast 10.80.252.255
inet6 fe80::250:56ff:feb1:be0f prefixlen 64 scopeid 0x20<link> //这一行就表示ipv6开启了
ether 00:50:56:b1:be:0f txqueuelen 1000 (Ethernet)
RX packets 93668 bytes 113979217 (108.6 MiB)
RX errors 0 dropped 97 overruns 0 frame 0
TX packets 61598 bytes 5262629 (5.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

关闭的步骤
echo "net.ipv6.conf.all.disable_ipv6=1" >> /etc/sysctl.conf
echo "NETWORKING_IPV6=no" >> /etc/sysconfig/network
echo NETWORKING_IPV6=no >> /etc/sysconfig/network-scripts/ifcfg-ens192
sysctl -p
输出结果为:net.ipv6.conf.all.disable_ipv6 = 1
在此查看ifconfig 就可以看到没有ipv6的信息了

socket读写缓冲区调优
实际上,调整Kafka的网络配置与其他的配置是一样的。首先可以对分配给socket读写缓冲区的内存大小作出调整,这样可以显著提升网络的传输性能。

[root@open-falcon-252-144 ~]# cat /proc/sys/net/core/wmem_default
212992
[root@open-falcon-252-144 ~]# sysctl -q net.core.wmem_default
net.core.wmem_default = 212992
//默认的TCP数据发送窗口大小(字节)。
[root@open-falcon-252-144 ~]# echo "net.core.wmem_default=256960" >> /etc/sysctl.conf #我这里设置发送大小为256KB
[root@open-falcon-252-144 ~]# sysctl -p
vm.swappiness = 1
net.core.wmem_default = 256960
[root@open-falcon-252-144 ~]# cat /proc/sys/net/core/rmem_default
212992
[root@open-falcon-252-144 ~]# sysctl -q net.core.rmem_default
net.core.rmem_default = 212992
//默认的TCP数据接收窗口大小(字节)。
[root@open-falcon-252-144 ~]# echo "net.core.rmem_default=256960" >> /etc/sysctl.conf #我这里接受大小设置的是256KB
[root@open-falcon-252-144 ~]# sysctl -p
vm.swappiness = 1
net.core.wmem_default = 256960
net.core.rmem_default = 256960
[root@open-falcon-252-144 ~]# cat /proc/sys/net/core/wmem_max
212992
[root@open-falcon-252-144 ~]# sysctl -q net.core.wmem_max
net.core.wmem_max = 212992
//最大的TCP数据发送窗口(字节)。
[root@open-falcon-252-144 ~]# echo "net.core.wmem_max=2097152" >> /etc/sysctl.conf #我这里将最大的TCP数据发送缓冲区最大值为2M  
[root@open-falcon-252-144 ~]# sysctl -p
vm.swappiness = 1
net.core.wmem_default = 256960
net.core.rmem_default = 256960
net.core.wmem_max = 2097152
[root@open-falcon-252-144 ~]# cat /proc/sys/net/core/rmem_max  
212992
[root@open-falcon-252-144 ~]# sysctl -q net.core.rmem_max
net.core.rmem_max = 212992
//最大的TCP数据接收窗口(字节)
[root@open-falcon-252-144 ~]# echo "net.core.rmem_max=2097152" >> /etc/sysctl.conf #我这里将TCP数据接受缓冲区的最大值设置为2M
[root@open-falcon-252-144 ~]# sysctl -p
vm.swappiness = 1
net.core.wmem_default = 256960
net.core.rmem_default = 256960
net.core.wmem_max = 2097152
net.core.rmem_max = 2097152
温馨提示:最大值并不意味着每个socket一定要有这么大大缓冲空间,只是说在必要大情况下才会达到这个值。

5、
预读缓冲
预读技术可以有效的减少磁盘寻道次数和应用的I/O等待时间,增加Linux文件系统预读缓冲区的大小(默认为256 sectors,128KB),可以明显提高顺序文件的读性能,建议调整到1024或2048 sectors。预读缓冲区的设置可以通过blockdev命令来完成。

[root@NewCDH-0--141 ~]# df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs        50G   45G  5.7G  89% /
devtmpfs                devtmpfs  7.8G     0  7.8G   0% /dev
tmpfs                   tmpfs     7.8G     0  7.8G   0% /dev/shm
tmpfs                   tmpfs     7.8G   49M  7.8G   1% /run
tmpfs                   tmpfs     7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/mapper/centos-home xfs        46G  342M   46G   1% /home
/dev/sda1               xfs       497M  121M  377M  25% /boot
tmpfs                   tmpfs     1.6G     0  1.6G   0% /run/user/0
cm_processes            tmpfs     7.8G   58M  7.7G   1% /run/cloudera-scm-agent/process
tmpfs                   tmpfs     1.6G     0  1.6G   0% /run/user/997
[root@NewCDH-0--141 ~]# blockdev --getra /dev/mapper/centos-root
8192
[root@NewCDH-0--141 ~]# blockdev --getra /dev/mapper/centos-home 
8192

修改的命令为:
blockdev --setra 2048 /dev/mapper/centos-home 

6、reboot

小结:
1、虚拟内存优化(swap):
echo "vm.swappiness=1" >> /etc/sysctl.conf 激活设置 sysctl -p
2、使用vm.dirty_ratio和vm.dirty_background_ratio更好的Linux磁盘缓存和性能 
echo "vm.dirty_background_ratio=5" >> /etc/sysctl.conf
echo "vm.dirty_ratio=10" >> /etc/sysctl.conf
3、一般在内网环境中,我们几乎是用不到IPV6,因此我们没有必要把多不用的功能开起来从而浪费不必要的资源。
echo "net.ipv6.conf.all.disable_ipv6=1" >> /etc/sysctl.conf
echo "NETWORKING_IPV6=no" >> /etc/sysconfig/network
echo NETWORKING_IPV6=no >> /etc/sysconfig/network-scripts/ifcfg-ens192
sysctl -p
4、调整TCP数据发送窗口大小(字节)。
echo "net.core.wmem_default=256960" >> /etc/sysctl.conf #我这里设置发送大小为256KB 激活设置 sysctl -p
5、调整TCP数据接收窗口大小(字节)。
echo "net.core.rmem_default=256960" >> /etc/sysctl.conf #我这里接受大小设置的是256KB 激活设置 sysctl -p
6、调整最大的TCP数据发送窗口(字节)。
echo "net.core.wmem_max=2097152" >> /etc/sysctl.conf  #我这里将最大的TCP数据发送缓冲区最大值为2M 激活设置 sysctl -p
7、调整最大的TCP数据接收窗口(字节)。
echo "net.core.rmem_max=2097152" >> /etc/sysctl.conf  #我这里将TCP数据接受缓冲区的最大值设置为2M 激活设置 sysctl -p
8、为自动调优定义socket使用的发送内存(写)。
echo "net.ipv4.tcp_wmem=8760  256960  4088000" >> /etc/sysctl.conf #根据服务接受的实际情况,可能需要设置更高的最大值,为网络链接提供更大的缓存空间。
//解释#第一个值是为socket发送缓冲区分配的最少字节数;第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)。
9、为自动调优定义socket使用的接受内存(读)。
echo "net.ipv4.tcp_rmem=8760  256960  4088000" >> /etc/sysctl.conf 
//#第一个值是为socket接收缓冲区分配的最少字节数;第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)。
10、其他网络参数调优
...//详细,见参考链接
具体最后实现:
[root@hadoop02-182 ~]# sysctl -p
vm.overcommit_memory = 1
net.core.somaxconn = 20480
vm.swappiness = 1
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
net.ipv6.conf.all.disable_ipv6 = 1
net.core.wmem_default = 256960
net.core.rmem_default = 256960
net.core.wmem_max = 2097152
net.core.rmem_max = 2097152
net.ipv4.tcp_wmem = 8760  256960  4088000
net.ipv4.tcp_rmem = 8760  256960  4088000

后期:会为这些内核参数的常规调整,写一个脚本 ,望期待!
脚本编写完成,请访问 linux内核高级优化脚本
参考链接:
Linux虚拟内存(swap)调优篇-“swappiness”,“vm.dirty_background_ratio”和“vm.dirty_ratio”
https://www.cnblogs.com/yinzhengjie/p/9994207.html
Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小
https://www.cnblogs.com/yinzhengjie/p/9995756.html
//在对Linux内核的一段优化,可以完全的参考上面2个链接 (生产适用)
Hadoop配置 - net.core.somaxconn https://blog.csdn.net/knowledgeaaa/article/details/24625489
linux的vm.overcommit_memory的内存分配参数详解 http://blog.chinaunix.net/uid-30401178-id-5159439.html

转载于:https://blog.51cto.com/12445535/2365948

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值