Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 100%CPU时如何提高Redis性能?碎片?最快的.Net客户端?_Performance_Redis_Sharding_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack.redis_Stackexchange.redis - Fatal编程技术网 servicestack.redis,stackexchange.redis,Performance,Redis,Sharding,servicestack.redis,Stackexchange.redis" /> servicestack.redis,stackexchange.redis,Performance,Redis,Sharding,servicestack.redis,Stackexchange.redis" />

Performance 100%CPU时如何提高Redis性能?碎片?最快的.Net客户端?

Performance 100%CPU时如何提高Redis性能?碎片?最快的.Net客户端?,performance,redis,sharding,servicestack.redis,stackexchange.redis,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)。我选择ServiceStack是因为存在使用ServiceStack.Redis的。我们以前使用过AngiesList.Redis和BookSleeve,但我们也有过100%的体验 我们有八台redis

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

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

我们有八台redis服务器,配置为主/从树。一台服务器用于会话状态tho。其他用于数据缓存。一个主设备,两个主设备/从设备分别连接到两个从设备

当服务器在100%CPU的情况下开始阻塞时,在峰值时,服务器可以容纳大约600个客户端连接

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

切分和/或StackExchange Redis客户端(据我所知,没有可用的会话状态客户端…)

或者是别的什么?会话服务器的命中率也达到100%,并且未连接到任何其他服务器(数据和网络吞吐量较低)


更新1:分析redis cli信息

这是运行redis2.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(切分)

我发现了一个有趣的组件,叫做。据我所知,这个组件可以跨多个redis实例进行切分

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


这将为我们节省大量编程时间,但在每台服务器上配置3个额外实例仍需要一些努力。因此,我希望有人能在我们开始工作之前确认或揭穿这个解决方案。

如果您还没有这样做,我的第一个简单建议是至少关闭主机上的所有RDB或AOF备份。当然,如果你的奴隶仍然保存到磁盘,他们可能会落后。有关RDB转储的成本,请参阅

另一件要做的事情是确保您正在通过管道传输所有命令。如果您单独发送多个可以分组到管道中的命令,您应该会看到性能的提升

另外,对于评测Redis,他有一个很好的答案

关于您的用例和数据结构的更多信息将有助于确定您是否可以对实际使用Redis的方式进行简单的更改,从而提高您的性能


编辑:为了回应您的最新评论,请注意,每次从机失去连接并重新连接时,它都会与主机重新同步。在以前的Redis版本中,这始终是一次完全的重新同步,因此相当昂贵。显然,在2.8版本中,从机现在可以请求部分重新同步自断开连接以来丢失的数据。我不知道太多的细节,但如果您的主设备或任何从设备不在2.8*上,并且您的连接不稳定,那么不断强迫您的主设备重新同步从设备可能会严重影响cpu性能。更多信息

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


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

我们在应用程序中发现了一个问题。通过redis通道订阅实现了缓存中更新数据与本地内存缓存的通信

每次刷新本地缓存、项目过期或项目更新时,都会将消息发送到所有(35)个Web服务器,而这些服务器又开始更新更多的项目,等等

禁用更新密钥的消息将我们的情况改善了10倍


网络带宽从1.2 Gbps下降到200Mbps,CPU利用率为40%,而目前的负载为极端计算和更新时的150%。

您能否澄清:是Redis具有高CPU,还是您的web层?这一点必须弄清楚。什么是操作?(Redis通过“info”显示即时操作数)@Marc:我澄清了这篇文章。我要看一下opcount。在这些加载过程中,info命令非常慢。Slowlog在会话缓存中显示71个条目(并计数),在数据缓存中显示128个条目并计数。我们目前没有承受太多的负荷。参赛作品在这里停留多长时间?这些数字多吗?@baskabas这听起来至少不像是连续的——除非它被简单地修剪到那个数字。是否有攻击性大的时间?任何超过5毫秒的事情我都会担心。但是下一步要看的是“监视”(简短地)——看看服务器实际上在做什么。你能详细说明你最后的评论(在回答中)吗?我们在Web服务器上使用本地memcache来减轻缓存的负载。因为我们运行2个worker,所以我们现在还在每个web服务器上放置一个redis的本地实例。如果我们让它们成为奴隶会发生什么?大多数条目都在10毫秒到20毫秒之间。两个都很突出,都是“PSYNC?-1”80ms-105ms。我们现在只有750个并发用户。。。昨晚我们达到了10公里以上。我已经监视了好几次,我只是看到很多键(和它们的数据)经过。你想要什么?@baskabas psync是复制,但听起来并不可怕。班长是m