Redis性能优化培训_第1页
Redis性能优化培训_第2页
Redis性能优化培训_第3页
Redis性能优化培训_第4页
Redis性能优化培训_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Redis性能优化培训快速掌握Redis性能优化编辑课件目录Redis简介Redis特性Redis性能数据指标常见性能问题分析性能优化方案性能测试编辑课件Redis简介Redis是一个开源的高性能Nosql数据库,也是基于内存的Key-Value存储系统,可以用作数据库、缓存和消息中间件支持多种数据结构:字符串、哈希表、列表、集合、有序集合、位图、Hyperloglogs内置了复制,LUA脚本,LRU数据淘汰,事务和不同级别的磁盘持久化等功能通过Sentinel哨兵和Cluster自动分片集群提供高可用性编辑课件Redis特性基于单线程模型实现,一个线程效劳所有客户端请求,采用非阻塞式IO线程平安,所有操作都是原子的,不会因并发产生数据异常速度非常快,大局部命令算法时间复杂度都是O(1)使用高耗时Redis命令很危险,会占用唯一线程的大量处理时间,导致所有的请求都被拖慢编辑课件Redis性能数据指标通过Redis-cli命令行界面访问到Redis效劳器,使用info命令获取丰富的Redis性能数据指标info命令输出的数据可分为10个类别,分别是:serverclientsmemorypersistencestatsreplicationcpucommandstatsclusterkeyspace编辑课件重要性能指标memory输入infomemory命令,只返回与内存相关的数据常用内存数据指标used_memory:已使用内存used_memory_rss:从操作系统上显示已经分配的内存总量mem_fragmentation_ratio:内存碎片率used_memory_lua:Lua脚本引擎所使用的内存大小mem_allocator:在编译时指定的Redis使用的内存分配器,可以是libc、jemalloc、tcmalloc以上指标都是以字节〔byte〕为单位编辑课件重要性能指标CPUused_cpu_sys:55.09

--Redis效劳器消耗的系统CPUused_cpu_user:26.16

--Redis效劳器消耗的用户CPUused_cpu_sys_children:0.02

--后台进程消耗的系统CPUused_cpu_user_children:0.01

--后台进程消耗的用户CPU编辑课件重要性能指标Clients记录了已连接客户端的信息connected_clients:1

--已连接客户端的数量〔不包括通过附属效劳器连接的客户端〕client_longest_output_list:0

--当前连接的客户端当中,最长的输出列表client_biggest_input_buf:0

--当前连接的客户端当中,最大输入缓存blocked_clients:0

--正在等待阻塞命令〔BLPOP、BRPOP、BRPOPLPUSH〕的客户端的数量编辑课件重要性能指标Stats记录了一般统计信息total_connections_received:782640

--效劳器已接受的连接请求数量total_commands_processed:6401614

--效劳器已执行的命令数量instantaneous_ops_per_sec:7

--效劳器每秒钟执行的命令数量latest_fork_usec:475--最近一次fork()操作消耗的毫秒数编辑课件重要性能指标Commandstats记录了各种不同类型的命令的执行统计信息记录命令执行的次数、命令消耗的CPU时间、执行每个命令消耗的平均CPU时间等等编辑课件常见性能问题分析一生产系统刚开始运行阶段,系统稳定。但是运行一段时间后,发现局部时间段系统接口响应变慢。查看客户端日志经常会出现这样的错误:redis.clients.jedis.exceptions.JedisConnectionException:.SocketTimeoutException:Readtimedout执行slowlog查看慢查询语句,发现有大量的keys命令操作,keys命令在大量并发情况下性能非常差正式环境中,尽量防止使用keys,接下来找出使用keys的代码做优化,至此,timeout问题解决编辑课件常见性能问题分析二生产环境长时间的运行后,经常会有接口返回数据失败的情况,或者是从监控上发现数据库压力某一时间暴增。查看客户端日志发现这样的错误:redis.clients.jedis.exceptions.JedisConnectionException:Couldnotgetaresourcefromthepool执行clientlist命令,发现大量的client的idle时间特别长检查配置发现timeout和tcp-keepalive均未启用〔均为0〕,redis效劳端没有有效的机制来确保效劳端已经建立的连接是否已经失效当效劳器和客户端网络出现闪断,导致tcp连接中断,这种情况下的client将会一直被redis效劳端所持有,就会出现上idle时间特长的client连接设置timeout和tcp-keepalive来清理失效的连接编辑课件常见性能问题分析三突然间效劳不能访问,返回错误:redis.clients.jedis.exceptions.JedisDataException:MISCONFRedisisconfiguredtosaveRDBsnapshots,butiscurrentlynotabletopersistondisk.Commandsthatmaymodifythedatasetaredisabled.PleasecheckRedislogsfordetailsabouttheerror.查看redis日志,发现有这个错误:Can’tsaveinbackground:fork:CannotallocatememoryRedis在保存内存的数据到磁盘时,为了防止主进程假死,会Fork一个子进程来完成这个保存操作,这个Fork的子进程会需要分配和主进程相同的内存,这时候就相当于需要的内存double了,如果这时候可用内存缺乏以分配需要的内存,将会导致Fock子进程失败而无法保存数据到磁盘。修改linux内核参数:vm.overcommit_memory=1,问题解决编辑课件优化措施总结结合实际使用场景,考虑是否需要用到redis的持久化,如果单纯用来做应用层的缓存〔在缓存未命中的情况下访问数据库〕,可以关闭持久化缓存模式下,尽量为每块缓存设置时效性,防止冷数据长时间占用资源生产环境中尽量防止使用keys操作,由于redis是单线程模式,大量的keys操作会阻塞其他的命令执行设置合理的内存回收策略,保证内存可用性的同时能适当的提供缓存的命中率提前计算出系统可能会用的内存大小,合理的分配内存。需要注意在开启持久化模式下,需要预留更多的内存提供给Fock的子进程做数据磁盘flush操作编辑课件性能优化方案关键参数优化长耗时命令优化延迟因素优化内存管理优化操作系统优化读写别离机制Redis集群编辑课件关键参数优化客户端最大连接数〔maxclients〕可能的错误信息:maxnumberofclientsreached默认为0,即不限制,一般不需要更改,所以客户端连接限制,取决于操作系统参数ulimit-n〔maxopenfiles〕,可通过修改/etc/security/limits.conf文件以永久生效。编辑课件关键参数优化主从响应策略〔repl-ping-slave-period/repl-timeout〕slave会每隔repl-ping-slave-period(默认10秒)ping一次master,如果超过repl-timeout(默认60秒)都没有收到响应,就会认为Master挂了。如果Master明明没挂但被阻塞住了也会报这个错。可以适当调大repl-timeout编辑课件关键参数优化客户端输出缓冲区〔client-output-buffer-limit〕当使用主从复制时,性能压测下,数据量会急剧增长,导致从节点需要复制的数据很大,消耗时长增加。slave没挂但被阻塞住了,比方正在loadingMaster发过来的RDB,Master的指令不能立刻发送给slave,就会放在outputbuffer中,在配置文件中有如下配置:client-output-buffer-limitslave256mb64mb60这是说负责发数据给slave的client,如果buffer超过256m或者连续60秒超过64m,就会被立刻强行关闭所以此时应该相应调大数值,否那么就会出现很悲剧的循环:Master传输一个很大的RDB给Slave,Slave努力地装载,但还没装载完,Master对client的缓存满了,再来一次编辑课件关键参数优化客户端最大连接数〔maxclients〕限制非预期的连接数增长,保持Redis的性能最优应设置为预期连接数峰值的110%到150之间,假设是连接数超出这个数字后,Redis会拒绝并立刻关闭新来的连接默认情况下,尽量不要让Redis实例的客户端连接数超出5000编辑课件长耗时命令优化*不要把List当做列表使用,仅当做队列来使用*通过机制严格控制Hash、Set、SortedSet的大小*可能的话,将排序、并集、交集等操作放在客户端执行*绝对禁止使用KEYS命令*防止一次性遍历集合类型的所有成员,而应使用SCAN类的命令进行分批的,游标式的遍历编辑课件长耗时命令优化SlowLog可以自动记录耗时较长的命令配置参数:slowlog-log-slower-thanxxx#执行时间慢于xxx微秒的命令计入SlowLogslowlog-max-lenxxx#SlowLog的长度,即最大记录多少条SlowLogSLOWLOGGET[number]命令,获取最近进入SlowLog的number条命令SLOWLOGRESET命令,重置SlowLog编辑课件延迟因素优化网络引发的延迟通常千兆网络环境中,TCP/IP网络延迟是200us(微秒),Unix域Socket可以低到30us减少网络往返时间RTT(Round-TripTime),官方优化建议:*长连接:不要频繁连接/断开到效劳器的连接,尽可能保持长连接*域Socket:客户端与Redis效劳端在同一台机器上,应使用Unix域Socket*多参数命令:相比管道,优先使用多参数命令,如mset/mget/hmset/hmget等*管道化:使用管道pipeline将连续执行的命令组合执行,减少RTT*LUA脚本:对于有数据依赖而无法使用管道的命令,可以考虑在Redis效劳端执行LUA脚本编辑课件延迟因素优化数据淘汰引发的延迟当同一秒内有大量key过期时,会引发Redis的延迟,尽量错开key的失效时间随机化设置过期时间,防止同一时间超过25%的Key过期导致的Redis阻塞Redis剔除过期Key的两种方式:被动:当客户端访问到Key时,发现已经过期,那么剔除主动:每100ms剔除一批Key,假设过期Key超过25%那么反复执行编辑课件延迟因素优化Swap引发的延迟当Linux将Redis所用的内存分页移至swap空间时,将会阻塞Redis进程,导致Redis出现不正常的延迟/proc/<pid>/smaps文件中会保存进程的swap记录,通过查看这个文件,能够判断Redis的延迟是否由Swap产生。如果这个文件中记录了较大的Swapsize,那么说明延迟很有可能是Swap造成的编辑课件延迟因素优化数据持久化引发的延迟Redis的数据持久化工作本身就会带来延迟,需要根据数据的平安级别和性能要求制定合理的持久化策略RDB持久化通常会提供比使用AOF更高的性能,但每次RDB快照和AOFRewrite都需要Redis主进程进行fork操作,fork操作本身可能会产生较高的耗时根据具体情况合理配置RDB快照和AOFRewrite时机,防止过于频繁的fork带来的延迟可以通过INFO命令返回的latest_fork_usec字段查看上一次fork操作的耗时〔微秒〕编辑课件内存管理优化内存使用率Redis内存使用used_memory超过可用内存的95%,局部数据开始在内存与Swap空间来回交换,严重影响性能如果没有开启RDB快照或AOF持久化策略,缓存数据在Redis崩溃时会有丧失风险当开启并触发快照功能时,Redis会fork一个子进程把当前内存中的数据完全复制一份写入到硬盘上。因此假设是当前使用内存超过可用内存的45%时触发快照功能,那么此时进行的内存交换会变的非常危险(可能会丧失数据)。倘假设在这个时候实例上有大量频繁的更新操作,问题会变得更加严重编辑课件内存管理优化内存使用率优化如果缓存数据小于4GB,使用32位的Redis实例可能的使用Hash数据结构设置key的过期时间回收key编辑课件内存管理优化内存回收策略maxmemory-policy“volatile-lru〞:使用LRU算法从已设置过期时间的数据集合中淘汰数据“volatile-ttl〞:从已设置过期时间的数据集合中淘汰即将过期的数据“volatile-random〞:从已设置过期时间的数据集合中随机淘汰数据“allkeys-lru〞:使用LRU算法从所有数据集合中淘汰数据“allkeys-random〞:从数据集合中任意淘汰数据“no-enviction〞:禁止淘汰数据编辑课件内存管理优化内存碎片率mem_fragmentation_ratio由操系统分配的内存used_memory_rss除以Redis分配的内存used_memory得出内存碎片是由操作系统低效的分配/回收物理内存导致的内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低,也说明redis没有发生内存交换内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片内存碎片率低于1,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换编辑课件内存管理优化内存碎片率优化重启Redis效劳器内存碎片率超过1.5,重启Redis可让额外产生的内存碎片失效并作为新内存使用限制内存交换内存碎片率低于1,应增加可用物理内存或减少Redis实例内存占用修改内存分配器Redis支持glibc、jemalloc和tcmalloc等几种不同的内存分配器,每个分配器在内存分配和碎片上都有不同的实现修改默认内存分配器,需要完全理解这几种内存分配器的差异,也需重新编译Redis,不建议普通管理员修改编辑课件内存管理优化优化总结根据业务需要选择适宜的数据类型为不同的应用场景设置相应的紧凑存储参数假设业务场景不需要数据持久化,关闭持久化方式用以提高处理性能及内存使用率如果需要使用持久化,根据是否可以容忍重启丧失局部数据在快照方式与语句追加方式之间选择其一,不要使用虚拟内存或磁盘存储方式不要让Redis所在机器物理内存使用超过实际内存总量的60%编辑课件操作系统优化内存分配控制内核参数vm.overcommit_memoryRedis建议把这个值设置为1,是为了让fork能够在低内存下也执行成功swappiness参数决定操作系统使用swap的倾向程度取值范围是0~100,swappiness的值越大,说明操作系统可能使用swap的概率越高,swappiness值越低,表示操作系统更加倾向于使用物理内存设置方法:echovm.swappiness={bestvalue}>>/etc/sysctl.conf编辑课件操作系统优化TransparentHugePages支持大内存页(2MB)分配,默认开启,Redis建议禁用,禁用方法:echonever>/sys/kernel/mm/transparent_hugepage/enabledOOMkillerOOMkiller会在可用内存缺乏时选择性的杀掉用户进程对于Redis效劳器来说,可以将所有Redis的oom_adj设置为最低值或者稍小的值,降低被OOMkiller杀掉的概率编辑课件操作系统优化NTP时间同步保证

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论