performance - 如何在 100% CPU 时提高 Redis 性能?分片?最快的 .Net 客户端?

标签 performance redis sharding servicestack.redis stackexchange.redis

由于我们网站上的大量负载增加,redis 现在正在努力应对峰值负载,因为 redis 服务器实例达到 100% CPU(在八个核心之一上)导致超时。

我们已将客户端软件更新到 ServiceStack V3(来自 BookSleeve 1.1.0.4)并将 Redis 服务器升级到 2.8.11(来自 2.4.x)。由于 Harbour.RedisSessionStateStore 的存在,我选择了 ServiceStack使用 ServiceStack.Redis。我们之前用过 AngiesList.Redis 和 BookSleeve,但是我们也体验了 100%。

我们有 8 个配置为主/从树的 redis 服务器。一个用于 session 状态的服务器。其他用于数据缓存。一个 master 和两个 master/slave 分别连接到两个 slave。

当服务器开始以 100% 的 CPU 阻塞时,服务器在峰值时保持大约 600 个客户端连接。

我们可以做些什么来提高性能?

分片和/或 StackExchange Redis 客户端(据我所知没有可用的 session 状态客户端......)。

还是别的什么东西? session 服务器也达到 100%,并且没有连接到任何其他服务器(数据和网络吞吐量很低)。


更新一:redis-cli INFO分析

这是运行 Redis 2.8 一晚后 INFO 命令的输出。

# Server
redis_version:2.8.11
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7a57b118eb75b37f
redis_mode:standalone
os:Linux 2.6.32-431.11.2.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:5843
run_id:d5bb838857d61a9673e36e5bf608fad5a588ac5c
tcp_port:6379
uptime_in_seconds:152778
uptime_in_days:1
hz:10
lru_clock:10765770
config_file:/etc/redis/6379.conf

# Clients
connected_clients:299
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:80266784
used_memory_human:76.55M
used_memory_rss:80719872
used_memory_peak:1079667208
used_memory_peak_human:1.01G
used_memory_lua:33792
mem_fragmentation_ratio:1.01
mem_allocator:jemalloc-3.2.0

# Persistence
loading:0
rdb_changes_since_last_save:70245
rdb_bgsave_in_progress:0
rdb_last_save_time:1403274022
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
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

# Stats
total_connections_received:3375
total_commands_processed:30975281
instantaneous_ops_per_sec:163
rejected_connections:0
sync_full:10
sync_partial_ok:0
sync_partial_err:5
expired_keys:8059370
evicted_keys:0
keyspace_hits:97513
keyspace_misses:46044
pubsub_channels:2
pubsub_patterns:0
latest_fork_usec:22040

# Replication
role:master
connected_slaves:2
slave0:ip=xxx.xxx.xxx.xxx,port=6379,state=online,offset=272643782764,lag=1
slave1:ip=xxx.xxx.xxx.xxx,port=6379,state=online,offset=272643784216,lag=1
master_repl_offset:272643811961
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:272642763386
repl_backlog_histlen:1048576

# CPU
used_cpu_sys:20774.19
used_cpu_user:2458.50
used_cpu_sys_children:304.17
used_cpu_user_children:1446.23

# Keyspace
db0:keys=77863,expires=77863,avg_ttl=3181732
db6:keys=11855,expires=11855,avg_ttl=3126767

更新 2:twemproxy(分片)

我发现了一个有趣的组件,叫做 twemproxy .据我了解,该组件可以跨多个 redis 实例进行分片。

这是否有助于减轻 CPU 负担?

这会节省我们大量的编程时间,但是在每个服务器上配置 3 个额外的实例仍然需要一些努力。所以我希望有人可以在我们投入工作之前确认或揭穿这个解决方案。

最佳答案

首先要做的是查看 slowlog get 50(或选择任意数量的行)——这显示了最后的 50 命令时间量。可能是您正在做的某些事情只是花的时间太长。如果我在 slowlog 中看到任何东西,我会很担心——我通常每隔几天就会看到一些东西。如果您经常看到很多项,那么:您需要调查您在服务器上实际正在做什么。永远不要做的一件致命的事情是 keys,但还有其他事情。

接下来要做的就是:缓存。在到达后端之前短路的请求是免费的。我们广泛使用 Redis,但这并不意味着我们也忽略了本地内存。

关于performance - 如何在 100% CPU 时提高 Redis 性能?分片?最快的 .Net 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24317200/

相关文章:

javascript - 是否可以通过使用 onload 事件来衡量 gpu/cpu 的性能?

mysql - 从两个大表的联接中选择不同的值

java - 如何捕获 redis.serializer.SerializationException

sql-server - 如何在不重复分片的情况下扩展数据库中的写入?

java - 大量对象、分片和 Java EE

php - mysql选择两个表并使用 "or"变得非常慢

http - CPU 绑定(bind)非常简单的应用程序 : which stack for high traffic?

javascript - 在 node.js 中使用数据库请求的结果

mongodb - 为什么 MongoDb 分片中 Collection 的文档数量在减少

algorithm - 迪士尼的 FastPass 是否有效和/或有用的队列理论