热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Redis开发陷阱及避坑指南!

本文由编程笔记#小编为大家整理,主要介绍了Redis开发陷阱及避坑指南!相关的知识,希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了Redis 开发陷阱及避坑指南!相关的知识,希望对你有一定的参考价值。










Java技术栈


www.javastack.cn


关注阅读更多优质文章












原文首发于博客园,作者:后青春期的Keats


地址:https://www.cnblogs.com/keatsCoder/


Linux 配置优化



我们在使用 过程中,可能更多的关注 本身的一些配置优化,如 AOF、RDB 配置、数据结构配置优化等。


但是很少关心 的载体,服务器的优化。而这往往为我们的项目运行带来灾难性的打击。因此服务器优化也是必不可少的。


内存分配控制


启动时,可能会出现下面的日志


# 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.

overcommit 是 Linux 的一种内存处理机制:Linux 对绝大多数内存申请都会回复 yes,以便运行更多的程序。因为申请内存后,并不会马上使用内存。这种机制就是 overcommit 。


而 overcommit_memory 是用来设置内存分配策略的,有三种取值
























含义
0 内核检查是否有足够可用内存,有则通过。没有则申请失败,并返回错误给进程
1 表示内核允许超量使用内存直到用完为止
2 表示内核绝不过量的使用内存


日志中 Background save 指的是 bgsave 和 bgrewriteaof 。根据操作系统的配置,如果 overcommit_memory 设置为 0 则可能会造成内存申请失败而导致后台持久化失败。


因此 建议将这个值设置为 1 是为了 fork 操作在低内存下也能执行成功。


设置方法



通过命令修改,立即生效。重启后会失效

sysctl vm.overcommit_memory=1

再将改动写入系统配置文件,使其永久有效


echo "vm.overcommit_memory=1" >> /etc/sysctl.conf

建议



采用

建议的配置是为了在极端情况下 Linux 可以挤出来一些内存供 备份,但是更建议
优先配置好 maxmemory ,给机器留 20%~30% 的空闲内存。



硬盘虚拟内存


swap 是指当物理内存不足时,拿出部分硬盘空间当 SWAP 分区(虚拟成内存)使用。我们都知道硬盘的读写速度相对于内存实在是太鸡肋,对于高并发、高吞吐的应用来说,磁盘IO通长会成为系统瓶颈。Linux 系统中 swappiness 的值控制操作系统使用 swap 的倾向程度。


查看内核版本:


uname -sr



























说明
0 内核版本 3.5 及以上 宁愿使用 OOM Killer 也不使用 SWAP;内核版本 3.4 及更早则反之
1 内核版本 3.5 及以上 宁愿使用 OOM Killer 也不使用 SWAP
60 默认值

主动使用 SWAP


PS:OOM Killer 是指当 Linux 发现操作系统内存不足时,主动杀死一些非内核进程的操作


设置方法



echo {value} > /proc/sys/vm/swappiness

echo vm.swappiness={value} >> etc/sysctl.conf


监控swap


查看 Swap 的总体情况


free -m


Redis 开发陷阱及避坑指南!

最后一行即展示了 Swap 的使用情况,一共 2047 Mb,以使用 0 Mb,空闲 2047 Mb


实时查看 Swap 的使用




参数 si 表示 swap in ,so 表示 swap out 在我的机器上都是 0 表示没有使用交换


查看指定进程的 Swap 情况


通过 ps -ef |grep redis 查看 进程号,例如 1621


通过 cat /proc/1621/smaps | grep Swap 命令查看每个内存块 Redis Swap 的使用情况


THP 内存页大小


启动时可能会看到下面的日志


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.


提示告诉我们建议修改 Transparent Huge Pages (THP) 的配置,Linux kernel 在 2.6.38 内核增加了 THP 特性,支持大内存页(2MB)分配,默认开启。

开启后可加快 fork 子进程的速度,但是 fork 操作后,每个内存页从原来的 4KB 变为 2MB,会大幅加重重写期间父进程内存消耗。


方法如下:


echo never > /sys/kernel/mm/transparent_hugepage/enabled

另外在 /etc/rc.local 中追加


echo never > /sys/kernel/mm/transparent_hugepage/enabled

对于某些发行版本(例如红帽6以上)配置文件不在这个位置(在 /sys/kernel/mm/redhat_transparent_hugepage/enabled),但是 检查 THP 是写死的此位置,所以虽然这么修改后  不报警然而实际是没有作用的,需要注意。应该改动对应位置的值


使用NTP 同步时间


在集群或哨兵环境中,多台服务器使用相同的网络时间协议同步时间能更方便的阅读日志,排查问题


可以设置定时任务同步时间


crontab -u //设定某个用户的cron服务
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务
crontab -i //打印提示,输入yes等确认信息

添加每小时执行一次的任务


0 * * * * /usr/sbin/ntpdate cn.pool.ntp.org > dev/null 2>&1

最大连接数限制


通过 ulimit -a 命令查看和设置当前用户进程的资源数,其中包含 open files 参数,是单个用户同时打开的最大文件描述符个数。虽然 中可以配置最大的客户端连接数(默认 10000) 。


内部最多使用 32 个文件描述符。当 open files = 4096 时,Redis 最大提供 4096-32=4064 个连接。因为它不能突破操作系统的限制。如果需要,使用如下命令修改:


ulimit -Sn {max-open-files}

TCP backlog


tcp backlog 配置的是 tcp 握手时候的队列大小。如果该值过小。会导致高并发场景下部分连接第三次握手ACK被丢弃。关于 backlog


The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

 启动时,会告诉我们系统配置中该值是 128,而 Redis 511。这个 511 是没用的,因为系统比这个小。需要修改系统 backlog 的值。


echo 511 > /proc/sys/net/core/somaxconn

参考文献:



《Redis开发与运维》 --- 付 磊 张益军



最近热文:

1、

2、

3、

4、

5、

6、

7、

8、!

9、

10、







点击「」获取面试题大全~



推荐阅读
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Linux的uucico命令使用方法及工作模式介绍
    本文介绍了Linux的uucico命令的使用方法和工作模式,包括主动模式和附属模式。uucico是用来处理uucp或uux送到队列的文件传输工具,具有操作简单快捷、实用性强的特点。文章还介绍了uucico命令的参数及其说明,包括-c或--quiet、-C或--ifwork、-D或--nodetach、-e或--loop、-f或--force、-i或--stdin、-I--config、-l或--prompt等。通过本文的学习,读者可以更好地掌握Linux的uucico命令的使用方法。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
author-avatar
cqm-kk_246
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有