2013-09-03 14 views
5

Redis'i oldukça fazla kullanan bir raylı uygulamasına sahibim - ancak - zaman zaman burada ve burada meydana gelen bir kaç Redis::TimeoutError görüyorum. Koşullarda desen yoktur. Hem web uygulamasında hem de arka planda çalışan işlerde (sidekiq kullanılarak işleniyor) sık sık değil ama zaman zaman ortaya çıkar.Rastgele oluşan hata ayıklama/düzeltme Redis :: TimeoutError nasıl?

Şimdi bunun temel nedenini nasıl izleyeceğimi ve dolayısıyla nasıl düzeltileceğini bilmiyorum. Redis örneği özel yerel 1Gbit ağında hem benim web sunucusu ve arka plan sunucusuna bağlanan ayrı bir fiziksel sunucu üzerinde çalışan

: Burada

benim kurulum konusunda bir arkaplan olduğunu. Tüm sunucular 12.04 ubuntu çalışıyor. Redis sürümü 2.6.10. Bu redis-cli INFO çıkışı

require 'redis' 
require 'redis/objects' 
REDIS = Redis.new(:url => APP_CONFIG['REDIS_URL']) 
Redis.current = REDIS 

geçerli:: Öyle gibi bir başlatıcı kullanılarak (3.2) benim raylar uygulamasından bağlıyorum benim REDIS konfigürasyonunda

# Server 
redis_version:2.6.10 
redis_git_sha1:00000000 
redis_git_dirty:0 
redis_mode:standalone 
os:Linux 3.2.0-38-generic x86_64 
arch_bits:64 
multiplexing_api:epoll 
gcc_version:4.6.3 
process_id:28475 
run_id:d89bbb1b81d3169c4228cf23c0988ae437d496a1 
tcp_port:6379 
uptime_in_seconds:14913365 
uptime_in_days:172 
lru_clock:1507056 

# Clients 
connected_clients:233 
client_longest_output_list:0 
client_biggest_input_buf:0 
blocked_clients:19 

# Memory 
used_memory:801637360 
used_memory_human:764.50M 
used_memory_rss:594706432 
used_memory_peak:4295394784 
used_memory_peak_human:4.00G 
used_memory_lua:31744 
mem_fragmentation_ratio:0.74 
mem_allocator:jemalloc-3.3.0 

# Persistence 
loading:0 
rdb_changes_since_last_save:23166 
rdb_bgsave_in_progress:0 
rdb_last_save_time:1378219310 
rdb_last_bgsave_status:ok 
rdb_last_bgsave_time_sec:4 
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 

# Stats 
total_connections_received:932395 
total_commands_processed:3088408103 
instantaneous_ops_per_sec:837 
rejected_connections:0 
expired_keys:31428 
evicted_keys:3007 
keyspace_hits:124093049 
keyspace_misses:53060192 
pubsub_channels:0 
pubsub_patterns:0 
latest_fork_usec:17651 

# Replication 
role:master 
connected_slaves:1 
slave0:192.168.0.2,6379,online 

# CPU 
used_cpu_sys:54000.21 
used_cpu_user:73692.52 
used_cpu_sys_children:36229.79 
used_cpu_user_children:420655.84 

# Keyspace 
db0:keys=1498962,expires=1310 

aşağıdaki kümesine sahip: sunucu normalde performans gösterirse

\fidaemonize yes 
pidfile /var/run/redis/redis-server.pid 
timeout 0 
loglevel notice 
databases 1 
save 900 1 
save 300 10 
save 60 10000 
stop-writes-on-bgsave-error yes 
rdbcompression yes 
rdbchecksum yes 
dbfilename dump.rdb 
dir /var/lib/redis 
slave-serve-stale-data yes 
slave-read-only yes 
slave-priority 100 
maxclients 1000 
maxmemory 4GB 
maxmemory-policy volatile-lru 
appendonly no 
appendfsync everysec 
no-appendfsync-on-rewrite no 
auto-aof-rewrite-percentage 100 
auto-aof-rewrite-min-size 64mb 
lua-time-limit 5000 
slowlog-log-slower-than 10000 
slowlog-max-len 128 
hash-max-ziplist-entries 512 
hash-max-ziplist-value 64 
list-max-ziplist-entries 512 
list-max-ziplist-value 64 
set-max-intset-entries 512 
zset-max-ziplist-entries 128 
zset-max-ziplist-value 64 
activerehashing yes 
client-output-buffer-limit normal 0 0 0 
client-output-buffer-limit slave 256mb 64mb 60 
client-output-buffer-limit pubsub 32mb 8mb 60 
+0

Zaman aşımı hataları toplu olarak veya düzensiz olarak geliyor. –

+0

Ayrıca, redis-cli --latency bir süreliğine çalıştırıldığında ev sahibiniz için maksimum gecikme süresi olarak ne anlama geliyor? –

+0

@MichaelPapile Küçük partiler halinde oluşabileceklerini düşünüyorum - ama emin değilim ve çok net değil - eğer öyleyse - her şey perde noktalarında ya da herhangi bir şeyde başarısız oluyor gibi görünmüyor –

cevap

7

:. I çok üreten Eğer SAVE komutunu kullanın çünkü

  • (o Konfigürasyon dosyanızı ayarlandıktan)/O ve sunucuyu çekiçleme, özellikle de Amazon'da EBS birimleri kullanıyorsanız.
  • Çünkü bir Redis slave'iniz var (aynen öncekiyle aynı, yansıtmadan önce SAVE yapıyor).
  • , çok sayıda dizinde çok yavaş olan bir KEY * kullanıyorsunuz.

Bu konularla ilgili bir makale yazdım, bkz. here.

1

Bu istemci tarafında bir sorun olabilir. Sunucudan değil, her redis istemci örneğinin de bir zaman aşımı ayarı vardır ve varsayılan ayar çok kısadır - birkaç milisaniye gibi bir şey. Bu nedenle, sunucu bu süre içinde yanıt vermiyorsa, istemci tarafından bir Redis :: TimeoutError yükseltilecektir.

Denediğiniz ilk şey, daha uzun bir zaman aşımı değeri ayarlamak ve işlerin daha iyi olup olmadığını görmek.

redis_url = 'redis://user:[email protected]:port/' 
redis = Redis.connect(:url => redis_url, :timeout => 0.7) 

Hatta daha uzun zaman aşımı ayarıyla, olmayacaktı zaman aşımı garantisi yoktur, ama sonra sisteminizin tasarımı bir sorun olurdu.

0

Kendi kodunuzu redis'e bağlanmak için mi yoksa sadece sidekiq'e izin vermek mi istiyorsunuz? Bağlantı koptuğunda bağlantı kodunu yeniden tasarlamanız gerektiğini düşünüyorum. Redis :: BaseConnectionError'u kurtarabilir ve yeniden bağlayabilirsiniz.

2
  1. Bazı "yavaş sorgu" olup olmadığını görmek için redis sunucusunda "slowlog" komutunu deneyin.
  2. "Zamanaşımı Hatası" oluştuğunda, "yavaş günlüğü" içindeki "hata redis komutu" nu görmek için bazı günlükleri yazın.
  3. istemci tarafında ayarını zaman aşımı ayarlamak
  4. birçok konuda gelebilir
İlgili konular