redis使用过程中主机内核层面的一些优化

案发现场的日志:

缓存集群redis重启错误报错:

29808:M 07 Jun 09:46:32.209 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 29808:M 07 Jun 09:46:32.209 # Server started, Redis version 3.0.4 29808:M 07 Jun 09:46:32.209 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 29808:M 07 Jun 09:46:32.209 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

优化选项: 1.调大/proc/sys/net/core/somaxconn参数 2.修改vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1  3.'echo never > /sys/kernel/mm/transparent_hugepage/enabled'  add it to your /etc/rc.local  有待测试

优化建议: 1.命令:sysctl -w net.core.somaxconn = 1024 或者 echo ‘net.core.somaxconn= 1024’ >>/etc/sysctl.conf;sysctl -p net.core.somaxconn是linux中的一个kernel参数,表示socket监听(listen)的backlog上限。 backlog是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。 而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。 当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。 所以说net.core.somaxconn限制了接收新 TCP 连接侦听队列的大小。 对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。生产环境和cpu的核数也是相关的,当前内核64和,参数值65535

2.命令:sysctl -w vm.overcommit_memory = 1 或者  echo 'vm.overcommit_memory = 1' >>/etc/sysctl.conf;sysctl -p overcommit_memory参数说明: 设置内存分配策略(可选,根据服务器的实际情况进行设置) /proc/sys/vm/overcommit_memory 可选值:0、1、2。 0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。 2, 表示内核允许分配超过所有物理内存和交换空间总和的内存 注意:redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存为8G, 这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。

有待测试:

3.命令:'echo never > /sys/kernel/mm/transparent_hugepage/enabled'  不启用(会限制内存碎片清理,会使用系统软件的算法管理内存映射)此处可能理解有误,欢迎指正。

与 /sys/kernel/mm/transparent_hugepage/defrag always  (表示时刻进行内存碎片清理)息息相关

    在 Linux 操作系统上运行内存需求量较大的应用程序时,由于其采用的默认页面大小为 4KB,因而将会产生较多 TLB Miss 和缺页中断,从而大大影响应用程序的性能。当操作系统以 2MB 甚至更大作为分页的单位时,将会大大减少 TLB Miss 和缺页中断的数量,显著提高应用程序的性能。这也正是 Linux 内核引入大页面支持的直接原因。好处是很明显的,假设应用程序需要 2MB 的内存,如果操作系统以 4KB 作为分页的单位,则需要 512 个页面,进而在 TLB 中需要 512 个表项,同时也需要 512 个页表项,操作系统需要经历至少 512 次 TLB Miss 和 512 次缺页中断才能将 2MB 应用程序空间全部映射到物理内存;然而,当操作系统采用 2MB 作为分页的基本单位时,只需要一次 TLB Miss 和一次缺页中断,就可以为 2MB 的应用程序空间建立虚实映射,并在运行过程中无需再经历 TLB Miss 和缺页中断(假设未发生 TLB 项替换和Swap)。     为了能以最小的代价实现大页面支持,Linux 操作系统采用了基于 hugetlbfs 特殊文件系统 2M 字节大页面支持。这种采用特殊文件系统形式支持大页面的方式, 使得应用程序可以根据需要灵活地选择虚存页面大小,而不会被强制使用 2MB 大页面。本文将针对 hugetlb 大页面的应用和内核实现两个方面进行简单的介绍,以期起到抛砖引玉的作用。

有关linux内核hugepage相关的资料:

https://www.kernel.org/doc/Documentation/vm/transhuge.txt

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xiaoxi666的专栏

Win10编译SqlCipher步骤

到目前为止,Sqlcipher源码就编译完成了。接下来就可以参考第一篇参考文章尽情使用该软件啦。

6493
来自专栏王二麻子IT技术交流园地

五、VueJs 填坑日记之将接口用webpack代理到本地

上一篇博文,我们已经顺利的从cnodejs.org请求到了数据,但是大家可以注意到我们的/src/api/index.js的第一句就是: // 配置API接口地...

60610
来自专栏皮振伟的专栏

[linux][memory]进程的最大内存使用量的讨论

前言: 一个进程最大能使用多少虚拟内存,能控制的地方还是比想象的多一点。 尤其是IaaS上,一个qemu进程能使用多少虚拟内存,就是对应着虚拟机的物理内存的最大...

2.3K11
来自专栏Felix的技术分享

Stetho的通信原理

3223
来自专栏雪胖纸的玩蛇日常

python3+django2 开发易语言网络验证(上)

3664
来自专栏黑白安全

用Burpsuite测试移动应用程序

保护移动应用程序是当今最重要的问题之一, 因此,对移动应用程序的测试已成为一种必要性,不仅向客户提供足够的安全性,而且向公司提供足够的安全性。

973
来自专栏PHP在线

Apache的httpd.conf文件配置详解

Apache的基本设置主要交由httpd.conf来设定管理,我们要修改Apache的相关设定,主要还是通过修改httpd.cong来实现。下面让我们来看看ht...

5408
来自专栏進无尽的文章

扒虫篇-Bug日志 Ⅲ

解决方法:可能是由于粘贴网页上的代码的时候两行之间的回车引起的,有未识别的回车或者换行,找到,删除掉就 OK了。

1462
来自专栏安富莱嵌入式技术分享

【安富莱】【RL-TCPnet网络教程】第8章 RL-TCPnet网络协议栈移植(RTX)

本章教程为大家讲解RL-TCPnet网络协议栈的RTX操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文件、配置文件和驱...

1534
来自专栏源码之家

一键安装桌面及VNC

5686

扫码关注云+社区

领取腾讯云代金券