33_redis在实践中的一些常见问题以及优化思路(包含linux内核参数优化)

Posted 尐海爸爸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了33_redis在实践中的一些常见问题以及优化思路(包含linux内核参数优化)相关的知识,希望对你有一定的参考价值。


基本讲解到现在,大家其实直接到公司里,就可以去搭建redis了

因为其实有些东西,也许没有讲解到细节的一些东西,比如一些参数的设置

不同的公司,不同的业务,不同的数据量,可能要调节的参数不同

到这里为止,大家就差不多了,按照这个思路,去搭建redis支撑高并发、高可用、海量数据的架构,部署

可以用公司里的一些已有的数据,导入进去,几百万,一千万,进去

做各种压力测试,性能,redis-benchmark,并发,QPS,高可用的演练,每台机器最大能存储多少数据量,横向扩容支撑更多数据

基于测试环境还有测试数据,做各种演练,去摸索一些最适合自己的一些细节的东西

你说你靠一套课程,搞定一个技术100%的所有的东西,几乎是不可能的

师傅领进门,修行在个人

一套好的课程,唯一的判断标准,就是在这个价格下,能教会你值得这个价格的一些技术和架构等等知识,是你从其他地方没法学到的,或者自己去学要耗费几倍的时间摸索的

这个课程的价值就已经达到了

你说你花了几百块钱,买了个课程,要求,课程,学完,立即就是独孤九剑,直接到公司里各种问题都能轻松解决

这个世界上,不存在这种课程,合理的价值观,大家才能有一个非常好的良性的互动的过程

spark等等课程

实际学了课程去做项目,100%会遇到大量自己没想到的问题,遇到了首先就自己尝试去解决,遇到问题,才是你的经验积累

遇到了问题,加我的QQ,然后跟我咨询咨询,我给你看看,也是可以的

spark,elasticsearch,java架构课程

70%~80%的问题,我都可以帮你搞定,我能做到的

1、fork耗时导致高并发请求延时

RDB和AOF的时候,其实会有生成RDB快照,AOF rewrite,耗费磁盘IO的过程,主进程fork子进程

fork的时候,子进程是需要拷贝父进程的空间内存页表的,也是会耗费一定的时间的

一般来说,如果父进程内存有1个G的数据,那么fork可能会耗费在20ms左右,如果是10G~30G,那么就会耗费20 * 10,甚至20 * 30,也就是几百毫秒的时间

info stats中的latest_fork_usec,可以看到最近一次form的时长

redis单机QPS一般在几万,fork可能一下子就会拖慢几万条操作的请求时长,从几毫秒变成1秒

优化思路

fork耗时跟redis主进程的内存有关系,一般控制redis的内存在10GB以内,slave -> master,全量复制

2、AOF的阻塞问题

redis将数据写入AOF缓冲区,单独开一个现场做fsync操作,每秒一次

但是redis主线程会检查两次fsync的时间,如果距离上次fsync时间超过了2秒,那么写请求就会阻塞

everysec,最多丢失2秒的数据

一旦fsync超过2秒的延时,整个redis就被拖慢

优化思路

优化硬盘写入速度,建议采用SSD,不要用普通的机械硬盘,SSD,大幅度提升磁盘读写的速度

3、主从复制延迟问题

主从复制可能会超时严重,这个时候需要良好的监控和报警机制

在info replication中,可以看到master和slave复制的offset,做一个差值就可以看到对应的延迟量

如果延迟过多,那么就进行报警

4、主从复制风暴问题

如果一下子让多个slave从master去执行全量复制,一份大的rdb同时发送到多个slave,会导致网络带宽被严重占用

如果一个master真的要挂载多个slave,那尽量用树状结构,不要用星型结构

5、vm.overcommit_memory

0: 检查有没有足够内存,没有的话申请内存失败
1: 允许使用内存直到用完为止
2: 内存地址空间不能超过swap + 50%

如果是0的话,可能导致类似fork等操作执行失败,申请不到足够的内存空间

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

6、swapiness

cat /proc/version,查看linux内核版本

如果linux内核版本<3.5,那么swapiness设置为0,这样系统宁愿swap也不会oom killer(杀掉进程)
如果linux内核版本>=3.5,那么swapiness设置为1,这样系统宁愿swap也不会oom killer

保证redis不会被杀掉

echo 0 > /proc/sys/vm/swappiness
echo vm.swapiness=0 >> /etc/sysctl.conf

7、最大打开文件句柄

ulimit -n 10032 10032

自己去上网搜一下,不同的操作系统,版本,设置的方式都不太一样

8、tcp backlog

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

 

以上是关于33_redis在实践中的一些常见问题以及优化思路(包含linux内核参数优化)的主要内容,如果未能解决你的问题,请参考以下文章

Redis 在 vivo 推送平台的应用与优化实践

Redis大集群扩容性能优化实践

Redis 内存优化在 vivo 的探索与实践

Redis 中的数据建模实践? [关闭]

Redis 最牛实践:业务层面和运维层面优化!

Redis 大集群扩容性能优化实践