性能优化 | redis性能监控及调优

2021年11月23日 阅读数:5
这篇文章主要向大家介绍性能优化 | redis性能监控及调优,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

<html> <head></head> <body> <main> <div class="blog-content-box"> <div class="article-header-box"> <div class="article-header"> <div class="article-title-box"> <span class="article-type type-2 float-left">转载</span> <h1 class="title-article">Redis状态与性能监控</h1> </div> <div class="article-info-box"> <div class="operating"> </div> </div> </div> </div> <article class="baidu_pl"> <div id="article_content" class="article_content clearfix"> <div class="article-source-link"> 原文连接: <a href="https://my.oschina.net/boonya/blog/3057697" target="_blank" rel="noopener">https://my.oschina.net/boonya/blog/3057697</a> </div> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-d284373521.css" /> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-d284373521.css" /> <div class="htmledit_views" id="content_views"> <div class="content" id="articleContent"> <div class="ad-wrap"> <p><a style="color:#A00;font-weight:bold;" href="https://my.oschina.net/u/2663968/blog/3051541" rel="nofollow" data-token="97d53542f985bc1200af0592221b7f47">为何80%的码农都作不了架构师?&gt;&gt;&gt; </a>&nbsp;&nbsp;<img src="https://www.oschina.net/img/hot3.png" alt="hot3.png" /></p> </div> <span id="OSC_h1_1"></span> <h1><a name="t0"></a><strong>Redis介绍</strong></h1> <p>Redis是一种高级key-value数据库。它跟memcached相似,不过数据能够持久化,并且支持的数据类型很丰富。有字符串,链表、哈希、集合和有序集合5种。支持在服务器端计算集合的并、交和补集(difference)等,还支持多种排序功能。因此Redis也能够被当作是一个数据结构服务器。Redis的全部数据都是保存在内存中,而后不按期的经过异步方式保存到磁盘上(这称为“半持久化模式”);也能够把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)</p> <span id="OSC_h1_2"></span> <h1><a name="t1"></a>一、redis-benchmark&nbsp;</h1> <p>redis基准信息,redis服务器性能检测<br /> redis-benchmark -h localhost -p 6379 -c 100 -n 100000&nbsp;<br /> 100个并发链接,100000个请求,检测host为localhost 端口为6379的redis服务器性能&nbsp;</p> <pre>[root@Architect redis-1.2.6]# redis-benchmark -h localhost -p 6379 -c 100 -n 100000 ====== PING ====== 10001 requests completed in 0.41 seconds 50 parallel clients 3 bytes payload keep alive: 1css

0.01% <= 0 milliseconds 23.09% <= 1 milliseconds 85.82% <= 2 milliseconds 95.60% <= 3 milliseconds 97.20% <= 4 milliseconds 97.96% <= 5 milliseconds 98.83% <= 6 milliseconds 99.41% <= 7 milliseconds 99.70% <= 8 milliseconds 99.99% <= 9 milliseconds 100.00% <= 12 milliseconds 24274.27 requests per second</pre> <p> </p> <span id="OSC_h1_3"></span> <h1><a name="t2"></a>二、redis-cli</h1> <p>redis-cli -h localhost -p 6380 monitor <br /> Dump all the received requests in real time; <br /> 监控host为localhost,端口为6380,redis的链接及读写操做 </p> <pre>[root@Architect redis-1.2.6]# redis-cli -h localhost -p 6380 monitor +OK +1289800615.808225 "monitor" +1289800615.839079 "GET" "name" +1289800615.853694 "PING" +1289800615.853783 "PING" +1289800615.854646 "PING" +1289800615.854974 "PING" +1289800615.857693 "PING" +1289800615.866862 "PING" +1289800615.871944 "PING"</pre> <p>redis-cli -h localhost -p 6380 info <br /> Provide information and statistics about the server ; <br /> 提供host为localhost,端口为6380,redis服务的统计信息 </p> <p> </p> <pre>[root@Architect redis-1.2.6]# redis-cli -h localhost -p 6380 info redis_version:2.0.4 redis_git_sha1:00000000 redis_git_dirty:0 arch_bits:32 multiplexing_api:epoll process_id:21990 uptime_in_seconds:490580 uptime_in_days:5 connected_clients:103 connected_slaves:0 blocked_clients:0 used_memory:4453240 used_memory_human:4.25M changes_since_last_save:200 bgsave_in_progress:0 last_save_time:1290394640 bgrewriteaof_in_progress:0 total_connections_received:809 total_commands_processed:44094018 expired_keys:0 hash_max_zipmap_entries:64 hash_max_zipmap_value:512 pubsub_channels:0 pubsub_patterns:0 vm_enabled:0 role:slave master_host:localhost master_port:6379 master_link_status:up master_last_io_seconds_ago:18 db0:keys=1319,expires=0</pre> <span id="OSC_h1_4"></span> <h1><a name="t3"></a><strong>三、<strong>redis-stat</strong></strong></h1> <p>redis-stat host localhost port 6380 overview<br /> Print general information about a Redis instance;<br /> 实时打印出host为localhost,端口为6380,redis实例的整体信息</p> <pre>[root@Architect redis-1.2.6]# redis-stat port 6380 overview ------- data ------ ------------ load ----------------------------- - childs - keys used-mem clients requests connections 1319 5.37M 103 44108021 (+44108021) 810
1319 5.38M 103 44108124 (+103) 810
1319 5.38M 103 44108225 (+101) 810
1319 5.39M 103 44108326 (+101) 810
1319 5.40M 103 44108427 (+101) 810
1319 5.41M 103 44108528 (+101) 810</pre> <p>redis-stat host localhost port 6380 overview<br /> Measure Redis server latency;<br /> 输出host为localhost,端口为6380,redis服务中每一个请求的响应时长</p> <pre>[root@Architect redis-1.2.6]# redis-stat port 6380 latency 1: 0.16 ms 2: 0.11 ms 3: 0.15 ms 4: 0.11 ms 5: 0.18 ms 6: 0.14 ms</pre> <span id="OSC_h1_5"></span> <h1><a name="t4"></a><strong>2、 Redis监控</strong></h1> <p>首先判断客户端和服务器<strong>链接是否正常</strong></p> <pre># 客户端和服务器链接正常,返回PONG redis> PING PONG  html

客户端和服务器链接不正常(网络不正常或服务器未能正常运行),返回链接异常

redis 127.0.0.1:6379> PING Could not connect to Redis at 127.0.0.1:6379: Connection refused</pre> <p>Redis 监控最直接的方法就是使用系统提供的 info 命令,只须要执行下面一条命令,就能得到 Redis 系统的状态报告。</p> <pre>redis-cli info</pre> <p>结果会返回 Server、Clients、Memory、Persistence、Stats、Replication、CPU、Keyspace 8个部分。从info大返回结果中提取相关信息,就能够达到有效监控的目的。</p> <p>先解释下各个参数含义</p> <pre># Server redis_version:2.8.8                     # Redis 的版本 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:bf5d1747be5380f redis_mode:standalone os:Linux 2.6.32-220.7.1.el6.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.7                       #gcc版本 process_id:49324                        # 当前 Redis 服务器进程id run_id:bbd7b17efcf108fdde285d8987e50392f6a38f48 tcp_port:6379 uptime_in_seconds:1739082               # 运行时间(秒) uptime_in_days:20                       # 运行时间(天) hz:10 lru_clock:1734729 config_file:/home/s/apps/RedisMulti_video_so/conf/zzz.conf  mysql

Clients

connected_clients:1                     #链接的客户端数量 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0  git

Memory

used_memory:821848                       #Redis分配的内存总量              used_memory_human:802.59K used_memory_rss:85532672                 #Redis分配的内存总量(包括内存碎片) used_memory_peak:178987632 used_memory_peak_human:170.70M           #Redis所用内存的高峰值 used_memory_lua:33792 mem_fragmentation_ratio:104.07           #内存碎片比率 mem_allocator:tcmalloc-2.0  github

Persistence

loading:0 rdb_changes_since_last_save:0            #上次保存数据库以后,执行命令的次数 rdb_bgsave_in_progress:0                 #后台进行中的 save 操做的数量 rdb_last_save_time:1410848505            #最后一次成功保存的时间点,以 UNIX 时间戳格式显示 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 aof_enabled:0                            #redis是否开启了aof aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok  redis

Stats

total_connections_received:5705          #运行以来链接过的客户端的总数量 total_commands_processed:204013          # 运行以来执行过的命令的总数量 instantaneous_ops_per_sec:0 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:34401                       #运行以来过时的 key 的数量 evicted_keys:0                           #运行以来删除过的key的数量 keyspace_hits:2129                       #命中key 的次数 keyspace_misses:3148                     #没命中key 的次数 pubsub_channels:0                        #当前使用中的频道数量 pubsub_patterns:0                        #当前使用中的模式数量 latest_fork_usec:4391  sql

Replication

role:master                              #当前实例的角色master仍是slave connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0  数据库

CPU

used_cpu_sys:1551.61 used_cpu_user:1083.37 used_cpu_sys_children:2.52 used_cpu_user_children:16.79  centos

Keyspace

db0:keys=3,expires=0,avg_ttl=0             #各个数据库的 key 的数量,以及带有生存期的 key 的数量</pre> <p><strong>内存使用</strong></p> <p>若是 Redis 使用的内存超出了可用的物理内存大小,那么 Redis 极可能系统会被杀掉。针对这一点,你能够经过 info 命令对 used_memory 和 used_memory_peak 进行监控,为使用内存量设定阀值,并设定相应的报警机制。固然,报警只是手段,重要的是你得预先计划好,当内存使用量过大后,你应该作些什么,是清除一些没用的冷数据,仍是把 Redis 迁移到更强大的机器上去。</p> <p><strong>持久化</strong></p> <p>若是由于你的机器或 Redis 自己的问题致使 Redis 崩溃了,那么你惟一的救命稻草可能就是 dump 出来的rdb文件了,因此,对 Redis dump 文件进行监控也是很重要的。能够经过对rdb_last_save_time 进行监控,了解最近一次 dump 数据操做的时间,还能够经过对rdb_changes_since_last_save进行监控来得到若是这时候出现故障,会丢失(即已改变)多少数据。</p> <p><strong>Keys</strong></p> <p>经过获取Keyspace中的结果获得各个数据库中key的数量</p> <p><strong>QPS</strong></p> <p>即每分钟执行的命令个数,即:(total_commands_processed2-total_commands_processed1)/span,为了实时获得QPS,能够设定脚本在后台运行,记录过去几分钟的total_commands_processed。在计算QPS时,利用过去的信息和当前的信息得出QPS的估计值。 </p> <span id="OSC_h1_6"></span> <h1><a name="t5"></a>3、 showlog功能</h1> <p>Redis 有一个实用的slowlog功能,正如你能够猜到的,可让你检查运行缓慢的查询。</p> <p>Slowlog 将会记录运行时间超过Y微秒的最后X条查询. X 和 Y 能够在 redis.conf 或者在运行时经过 CONFIG 命令: </p> <pre>CONFIG SET slowlog-log-slower-than 5000 CONFIG SET slowlog-max-len 25</pre> <p>slowlog-log-slower-than 是用来设置微秒数的, 所以上面的设置将记录执行时间超过5秒的查询. 要获取记录的日志,你可使用 SLOWLOG GET X 命令, 这里 X 是你想要获取的记录条数:</p> <pre>SLOWLOG GET 10</pre> <span id="OSC_h1_7"></span> <h1><a name="t6"></a>4、Redis中统计各类数据大小的方法</h1> <p> Redis 内存比较大的话,咱们就不太容易查出是哪些(种)键占用的空间。</p> <p>有一些工具可以提供必要的帮助,好比 <a href="https://github.com/sripathikrishnan/redis-rdb-tools" rel="nofollow" data-token="4ef49d8ca437e06714bcb6b7cc272019">redis-rdb-tools</a> 能够直接分析 RDB 文件来生成报告</p> <p> </p> <span id="OSC_h1_8"></span> <h1><a name="t7"></a>5、超强、超详细Redis数据库入门教程</h1> <p><a href="http://www.jb51.net/article/56448.htm">http://www.jb51.net/article/56448.htm</a></p> <p><a href="http://www.yiibai.com/redis">http://www.yiibai.com/redis/</a></p> <span id="OSC_h1_9"></span> <h1><a name="t8"></a>6、 Redis操做命令总结</h1> <p><a href="http://www.jb51.net/article/61793.htm">http://www.jb51.net/article/61793.htm</a></p> <span id="OSC_h1_10"></span> <h1><a name="t9"></a>7、Redis存储策略和最大内存</h1> <p>在redis中,容许用户设置最大使用内存大小maxmemory(须要配合maxmemory-policy使用),设置为0表示不限制;当redis内存数据集快到达maxmemory时,redis会实行数据淘汰策略。Redis提供6种数据淘汰策略:</p> <ol> <li>volatile-lru:从已设置过时时间的内存数据集中挑选最近最少使用的数据 淘汰;</li> <li>volatile-ttl: 从已设置过时时间的内存数据集中挑选即将过时的数据 淘汰;</li> <li>volatile-random:从已设置过时时间的内存数据集中任意挑选数据 淘汰;</li> <li>allkeys-lru:从内存数据集中挑选最近最少使用的数据 淘汰;</li> <li>allkeys-random:从数据集中任意挑选数据 淘汰;</li> <li>no-enviction(驱逐):禁止驱逐数据。(默认淘汰策略。当redis内存数据达到maxmemory,在该策略下,直接返回OOM错误);<br /> 关于maxmemory设置,经过在redis.conf中maxmemory参数设置,或者经过命令CONFIG SET动态修改<br /> 关于数据淘汰策略的设置,经过在redis.conf中的maxmemory-policy参数设置,或者经过命令CONFIG SET动态修改</li> </ol> <p>如127.0.0.1:6379>CONFIG GET maxmemory<br /> 1) “maxmemory"<br /> 2) “0”<br /> 127.0.0.1:6379>CONFIG SET maxmemory 100MB<br /> OK<br /> 127.0.0.1:6379>CONFIG GET maxmemory</p> <ol> <li>“maxmemory"</li> <li>“104857600”</li> </ol> <p>注意,在64bit系统下,maxmemory设置为0表示不限制Redis内存使用,在32bit系统下,maxmemory不能超过3GB;</p> <p>应用:<br /> 如mysql里有2000w条数据,redis只存20w条热点数据,如何保证redis中的数据都是热点数据?<br /> 这就能设置最大内存,再设置淘汰策略,设置volatile-lru,allkeys-lru等均可以;</p> <span id="OSC_h2_11"></span> <h2><a name="t10"></a>设置Redis最大占用内存</h2> <p>Redis设置最大占用内存,打开redis配置文件,找到以下段落,设置maxmemory参数,maxmemory是bytes字节类型,注意转换。修改以下所示:</p> <pre><code># In short... if you have slaves attached it is suggested that you set a lowerapi

limit for maxmemory so that there is some free RAM on the system for <a href="https://www.centos.bz/tag/slave/" rel="nofollow" data-token="d343bc15b985580f024e94811169e7b6">slave</a>

output buffers (but this is not needed if the policy is 'noeviction').

maxmemory <bytes>

maxmemory 268435456</code></pre> <p> </p> </div> <p>转载于:https://my.oschina.net/boonya/blog/3057697</p> </div> </div> </article>

</div> </main> </body> </html>

上一篇: Redis的安装部署
下一篇: 简单了解Redis