【Azure Redis 缓存 Azure Cache For Redis】Redis性能问题,发现Server Load非常的高,导致正常连接/操作不成功
问题描述
在正常使用Azure Redis的服务中,突然发现Redis 的CPU达到了100%, 正常的使用中发现性能问题严重。从Redis的门户图表中,观察到CPU, Connection,Lentency,Server Load都出现高的情况
|
CPU
|
Server Load
|
|
Lentency(Redis处理请求的延迟情况)
|
Connection(客户端连接数情况)
|
问题分析
根据以上的图表发现,在Connection高的情况下导致了CPU上升并持续到100%, 引起了Server Load比较高(有时达到100%),从而导致在整个Redis的延迟升高。
在Redis创建一个新的连接时,是非常昂贵的高消耗操作。同时在Azure中,每一种定价级别的Redis都有连接数的限制,如果达到限制都会导致性能问题。而根据Reids的官方文档说明,当前连接数就是因为超过了最大上限。
如基本层的连接数限制为(https://www.azure.cn/pricing/details/cache/)
| 缓存名称 | 缓存大小 | 基本 | 网络性能 | 客户端连接数量 |
|---|---|---|---|---|
| C0 | 250 MB | ¥0.14片/节点/小时(约¥104.16 /月) | 低 | 256 |
| C1 | 1 GB | ¥0.35片/节点/小时(约¥260.40 /月) | 中等 | 1000 |
| C2 | 2.5 GB | ¥0.57片/节点/小时(约¥424.08 /月) | 中等 | 2000 |
| C3 | 6 GB | ¥1.14片/节点/小时(约 ¥848.16 /月) | 高 | 5000 |
| C4 | 13 GB | ¥1.33片/节点/小时(约 ¥989.52 /月) | 中等 | 10000 |
| C5 | 26 GB | ¥2.66片/节点/小时(约 ¥1979.04 /月) | 高 | 15000 |
| C6 | 53 GB | ¥5.31片/节点/小时(约¥3950.64 /月) | 最高 | 20000 |
而在处理请求的并发和性能上,可以参考(https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-planning-faq#azure-cache-for-redis-performance):
| 定价层 | 大小 | CPU 核心数 | 可用带宽 | 1 KB 值大小 | 1 KB 值大小 |
|---|---|---|---|---|---|
| 标准缓存大小 | 兆位/秒(Mb/秒)/兆字节/秒(MB/秒) | 非 SSL 请求数/秒 (RPS) | SSL 请求数/秒 (RPS) | ||
| C0 | 250 MB | 共享 | 100/12.5 | 15,000 | 7,500 |
| C1 | 1 GB | 1 | 500/62.5 | 38,000 | 20,720 |
| C2 | 2.5 GB | 2 | 500/62.5 | 41,000 | 37,000 |
| C3 | 6 GB | 4 | 1000/125 | 100,000 | 90,000 |
| C4 | 13 GB | 2 | 500/62.5 | 60,000 | 55,000 |
| C5 | 26 GB | 4 | 1,000 / 125 | 102,000 | 93,000 |
| C6 | 53 GB | 8 | 2,000 / 250 | 126,000 | 120,000 |
解决办法
使用连接池来改善连接问题, 如JedisPool,可以参考GitHub中的说明:https://gist.github.com/JonCole/925630df72be1351b21440625ff2671f#use-jedispool, (如链接不可访问,可以点击[转] Azure Redis Best Practices - Java)参考示例代码:
9 private static JedisPool pool;
15 private static JedisPoolConfig config;
16
17 // Should be called exactly once during App Startup logic.
18 public static void initializeSettings(String host, int port, String password, int connectTimeout, int operationTimeout) {
19 Redis.host = host;
20 Redis.port = port;
21 Redis.password = password;
22 Redis.connectTimeout = connectTimeout;
23 Redis.operationTimeout = operationTimeout;
24 }
25
26 // MAKE SURE to call the initializeSettings method first
27 public static JedisPool getPoolInstance() {
28 if (pool == null) { // avoid synchronization lock if initialization has already happened
29 synchronized(staticLock) {
30 if (pool == null) { // don't re-initialize if another thread beat us to it.
31 JedisPoolConfig poolConfig = getPoolConfig();
32 boolean useSsl = port == 6380 ? true : false;
33 int db = 0;
34 String clientName = "MyClientName"; // null means use default
35 SSLSocketFactory sslSocketFactory = null; // null means use default
36 SSLParameters sslParameters = null; // null means use default
37 HostnameVerifier hostnameVerifier = new SimpleHostNameVerifier(host);
38 pool = new JedisPool(poolConfig, host, port, connectTimeout,operationTimeout,password, db,
39 clientName, useSsl, sslSocketFactory, sslParameters, hostnameVerifier);
40 }
41 }
42 }
43 return pool;
44 }
45
46 public static JedisPoolConfig getPoolConfig() {
47 if (config == null) {
48 JedisPoolConfig poolConfig = new JedisPoolConfig();
49
50 // Each thread trying to access Redis needs its own Jedis instance from the pool.
51 // Using too small a value here can lead to performance problems, too big and you have wasted resources.
52 int maxConnections = 200;
53 poolConfig.setMaxTotal(maxConnections);
54 poolConfig.setMaxIdle(maxConnections);
55
56 // Using "false" here will make it easier to debug when your maxTotal/minIdle/etc settings need adjusting.
57 // Setting it to "true" will result better behavior when unexpected load hits in production
58 poolConfig.setBlockWhenExhausted(true);
59
60 // How long to wait before throwing when pool is exhausted
61 poolConfig.setMaxWaitMillis(operationTimeout);
62
63 // This controls the number of connections that should be maintained for bursts of load.
64 // Increase this value when you see pool.getResource() taking a long time to complete under burst scenarios
65 poolConfig.setMinIdle(50);
66
67 Redis.config = poolConfig;
68 }
69
70 return config;
71 }
114 }
如PHP, NodeJS, ASP.Net的代码,都可以在以上的GitHub中找到示例代码。
同时,也非常推荐在代码中使用Lazy模式。
Reconnecting with
Lazy<T>patternWe have seen a few rare cases where StackExchange.Redis fails to reconnect after a connection blip (for example, due to patching). Restarting the client or creating a new ConnectionMultiplexer will fix the issue. Here is some sample code that still uses the recommended
Lazy<ConnectionMultiplexer>pattern while allowing apps to force a reconnection periodically. Make sure to update code calling into the ConnectionMultiplexer so that they handle anyObjectDisposedExceptionerrors that occur as a result of disposing the old one.
1 using System;
2 using System.Threading;
3 using StackExchange.Redis;
4
5 static class Redis
6 { 21 static string connectionString = "TODO: CALL InitializeConnectionString() method with connection string";
22 static Lazy<ConnectionMultiplexer> multiplexer = CreateMultiplexer();
23
24 public static ConnectionMultiplexer Connection { get { return multiplexer.Value; } }
25
93
94 private static Lazy<ConnectionMultiplexer> CreateMultiplexer()
95 {
96 return new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(connectionString));
97 }
参考资料
Redis Best Practices: https://gist.github.com/JonCole/925630df72be1351b21440625ff2671f#reuse-connections (如链接不可访问,可以点击[转]Azure Redis Best Practices - PHP)
Azure Redis 缓存性能: https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-planning-faq#azure-cache-for-redis-performance
Reuse Connections: https://gist.github.com/JonCole/925630df72be1351b21440625ff2671f#php
Reuse Connections
The most common problem we have seen with PHP clients is that they either don't support persistent connections or the ability to reuse connections is disabled by default. When you don't reuse connections, it means that you have to pay the cost of establishing a new connection, including the SSL/TLS handshake, each time you want to send a request. This can add a lot of latency to your request time and will manifest itself as a performance problem in your application. Additionally, if you have a high request rate, this can cause significant CPU churn on both the Redis client-side and server-side, which can result in other issues.
As an example, the Predis Redis client has a
"persistent"connection property that is false by default. Setting the"persistent"property to true will should improve behavior drastically.
【Azure Redis 缓存 Azure Cache For Redis】Redis性能问题,发现Server Load非常的高,导致正常连接/操作不成功的更多相关文章
- 【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
问题描述 Azure Redis和所有的Redis服务一样,可以让你保留存储在Redis中的数据.以防万一在Redis服务器出现故障的时候能尽可能小的减少数据的损失.在Azure Redis服务中,默 ...
- 【Azure Redis 缓存 Azure Cache For Redis】Azure Redis由低级别(C)升级到高级别(P)的步骤和注意事项, 及对用户现有应用的潜在影响,是否需要停机时间窗口,以及这个时间窗口需要多少的预估问题
问题描述 由于Azure Redis的性能在不同级别表现不同,当需要升级/缩放Redis的时候,从使用者的角度,需要知道有那些步骤? 注意事项? 潜在影响?停机事件窗口? 升级预估时间? 解决方案 从 ...
- spring boot redis 缓存(cache)集成
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- 【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
当使用Azure Redis高级版时候,为了能更好的保护Redis的安全,启用了虚拟网路,把Redis集成在Azure中的虚拟网络,只能通过虚拟网络VENT中的资源进行访问,而公网是不可以访问的.但是 ...
- 【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能
问题描述 关于Azure Redis的性能问题,在官方文档中,可以查看到不同层级Redis的最大连接数,每秒处理请求的性能. 基本缓存和标准缓存 C0 (250 MB) 缓存 - 最多支持 256 个 ...
- 【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
问题描述 在使用Azure Redis时,遇见Read Timed out异常, Redis的客户端使用的时jedis.问题发生时,执行redis部分指令出错,大部分get指令,set指令能正常执行. ...
- 【Azure Redis 缓存 Azure Cache For Redis】当使用Jedis客户端连接Redis时候,遇见JedisConnectionException: Could not get a resource from the pool / Redis connection lost
问题情形 当在执行Redis一直指令时,有可能会遇见如下几种错误: 1) redis.clients.jedis.exceptions.JedisConnectionException: Could ...
- 【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
简介 学习Redis Cluster的第一步,即本地搭建Redis Cluster.但是在Redis的官方文档中,是介绍在Linux系统中搭建Redis Cluster.本文主要介绍在Windows系 ...
- Redis缓存篇(一)Redis是如何工作的
Redis提供了高性能的数据存取功能,所以广泛应用在缓存场景中,既能有效地提升业务应用的响应速度,还可以避免把高并发压力发送到数据库层. 因为Redis用作缓存的普遍性以及它在业务应用中的重要作用,所 ...
随机推荐
- Linux实战(9):Docker一键搭建kms服务
server端 docker pull luodaoyi/kms-server docker run -itd -p 1688:1688 --name kms luodaoyi/kms-server ...
- Boolean.valueOf(String)
Boolean.valueOf(String) a. 当 String 的参数值在不区分大小写的时候等于 "true" ,则 Boolean.valueOf(String) 返回值 ...
- Hadoop学习笔记(一):ubuntu虚拟机下的hadoop伪分布式集群搭建
hadoop百度百科:https://baike.baidu.com/item/Hadoop/3526507?fr=aladdin hadoop官网:http://hadoop.apache.org/ ...
- nohup命令重定向标准输出和错误输出
命令:command > /dev/null 2>&1 & 输出到/dev/null表示输出重定向到黑洞,即输出内容不打印到屏幕上,null是/dev下空设备文件. &g ...
- 深入研究RocketMQ生产者发送消息的底层原理
前言 hello,小伙伴们,王子又来和大家研究RocketMQ的原理了,之前的文章RocketMQ生产部署架构如何设计中,我们已经简单的聊过了生产者是如何发送消息给Broker的. 我们简单回顾一下这 ...
- 1500多套微信小程序带后端源码-史上最全的不同行业的源码集合
如何下载获取在最后面! 部分源码 部分源码 部分源码 部分截图 o2o行业 | - 盒马鲜生 | - 轻客洗衣 互联网行业 | - 云文档 | - 仿ofo共享单车 | - 仿美团外卖 | - 仿饿了 ...
- XSS基础笔记 from 《Web安全攻防 渗透测试实战指南》
XSS漏洞介绍 跨站脚本(Cross Site Scripting, 简称为XSS或跨站脚本或跨站脚本攻击)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种.它允许恶意用户将代码注入网页,其 ...
- 大白话谈JVM的类加载机制
前言 我们很多小伙伴平时都是做JAVA开发的,那么作为一名合格的工程师,你是否有仔细的思考过JVM的运行原理呢. 如果懂得了JVM的运行原理和内存模型,像是一些JVM调优.垃圾回收机制等等的问题我们才 ...
- 划重点!AWS的湖仓一体使用哪种数据湖格式进行衔接?
此前Apache Hudi社区一直有小伙伴询问能否使用Amazon Redshift查询Hudi表,现在它终于来了. 现在您可以使用Amazon Redshift查询Amazon S3 数据湖中Apa ...
- 【小白学PyTorch】18 TF2构建自定义模型
[机器学习炼丹术]的炼丹总群已经快满了,要加入的快联系炼丹兄WX:cyx645016617 参考目录: 目录 1 创建自定义网络层 2 创建一个完整的CNN 2.1 keras.Model vs ke ...



