복붙노트

[REDIS] 어떻게하면 100 % CPU 레디 스의 성능을 향상시키기 위해? 샤딩? 가장 빠른 닷넷 클라이언트?

REDIS

어떻게하면 100 % CPU 레디 스의 성능을 향상시키기 위해? 샤딩? 가장 빠른 닷넷 클라이언트?

레디 스 서버 인스턴스가 타임 아웃의 결과 (1 ~ 8의 코어에) 100 % CPU에 도달하기 때문에 우리의 웹 사이트 레디 스에 엄청난 부하가 증가로 인해 지금은 피크 부하로 어려움을 겪고있다.

우리는 (BookSleeve 1.1.0.4에서 오는) ServiceStack V3 우리의 클라이언트 소프트웨어를 업데이트 (2.4.x에서에서 오는) 2.8.11로 레디 스 서버를 업그레이드했습니다. 나는 때문에 ServiceStack.Redis를 사용하는 Harbour.RedisSessionStateStore의 존재에 ServiceStack를 선택했다. 우리는 함께 BookSleeve와 전에 AngiesList.Redis을 사용하지만, 우리는 그것도 100 %를 경험했다.

우리는 마스터 / 슬레이브 트리로 구성 팔 개 레디 스 서버가 있습니다. 세션 상태 상점에 대한 하나 개의 단일 서버. 나머지는 데이터 캐시를위한 것입니다. 두 노예 각각 연결된 두 개의 마스터 / 슬레이브와 하나 개의 마스터.

그들은 100 %의 CPU에 막힌 얻을 시작할 때 서버는 최대 600에 대한 클라이언트 연결을 누릅니다.

우리는 성능을 향상하기 위해 무엇을 할 수 있는가?

(... 내 지식을 사용할 수없는 세션 상태 클라이언트) 샤딩 및 / 또는 StackExchange 레디 스 클라이언트.

아니면 다른 뭔가 될 수 있을까? 세션 서버는 100 % 안타과는 다른 서버 (낮은 처리량 데이터 및 네트워크)에 연결되어 있지 않습니다.

업데이트 1 : 레디 스-CLI 정보의 분석

여기 레디 스 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라는 흥미로운 요소를 발견했습니다. 이 구성 요소는, 내가 그것을 이해, 여러 레디 스의 인스턴스에서 파편 수 있습니다.

이 도움말은 CPU를 완화시겠습니까?

그것은 우리에게 프로그래밍 많은 시간을 절약 할 수 있지만, 여전히 각 서버에서 3 개 추가 인스턴스를 구성하기 위해 어떤 노력을 걸릴 것이다. 나는 누군가가 확인하거나 우리가 작업에 넣어 전에이 솔루션을 폭로 할 수 바라고 있어요 그래서.

해결법

  1. ==============================

    1.당신이하지 않은 경우 나의 첫 번째, 간단한 제안은 이미 최소한 마스터의 모든 RDB 또는 AOF 백업을 해제하는 것입니다. 그들은 여전히 ​​디스크에 저장하는 경우 물론 다음 노예 뒤에 떨어질 수 있습니다. RDB 덤프의 비용의 생각이 참조

    당신이하지 않은 경우 나의 첫 번째, 간단한 제안은 이미 최소한 마스터의 모든 RDB 또는 AOF 백업을 해제하는 것입니다. 그들은 여전히 ​​디스크에 저장하는 경우 물론 다음 노예 뒤에 떨어질 수 있습니다. RDB 덤프의 비용의 생각이 참조

    할 또 다른 것은 당신이 당신의 모든 명령을 파이프 라이닝하고 확인하는 것입니다. 당신이 파이프 라인으로 분류 할 수 있습니다 개별적으로 많은 명령을 보내는 경우에는 성능이 충돌을 볼 수 있습니다.

    또한,이 SO 게시물 레디 스 프로파일에 대한 좋은 답변이 있습니다

    더 많은 사용 사례에 대한 정보 및 데이터 구조는 당신에게 개선을 줄 것이다 당신이 실제로 레디 스를 사용하는 방법에 만들 수있는 간단한 변화가 있는지 여부를 결정하는 데 도움이 될 것입니다.

    편집 : 최근 코멘트, 당신은 노예를 잃게 연결 및 재 연결을 할 때마다, 그것은 다시 동기화를 할 것이라는 마스터와 노트에 그것의 좋은에 대응. 꽤 비싼 그래서 레디 스의 이전 버전이 항상 완전한 재 동기화이었다. 분명히 2.8 슬레이브는 지금은 그것의 분리 이후 놓친 그냥 데이터의 부분 재 동기화를 요청할 수있다. 나는 세부 사항에 대해 훨씬 잘 모르겠지만, 마스터 또는 슬레이브의 경우 중 하나가 2.8에 없습니다. * 당신이 흔들리는 연결이, 그건 정말 끊임없이 재 동기화에 마스터를 강제하여 CPU 성능을 해칠 수 노예. 여기에 더 많은 정보

  2. ==============================

    2.우리는 우리의 응용 프로그램 내부의 문제를 발견했다. 로컬 메모리 캐시 우리의 캐시에 업데이트 된 데이터에 대한 통신은 레디 스 채널 구독을 통해 실현되었다.

    우리는 우리의 응용 프로그램 내부의 문제를 발견했다. 로컬 메모리 캐시 우리의 캐시에 업데이트 된 데이터에 대한 통신은 레디 스 채널 구독을 통해 실현되었다.

    로컬 캐시가 플러싱 때마다 항목이 만료 또는 항목은 메시지가 차례로 더 많은 항목, 등, 등을 업데이트 시작 느릅 나무 전체 (35) 웹 서버로 전송있어 업데이트 된

    업데이트 된 키에 대한 메시지를 사용하지 않도록 설정하면 10 배에 의해 우리의 상황을 개선.

    네트워크 대역폭은 200Mbps의 1.2 Gbps의에서 삭제 및 CPU 사용률이 150 % 우리가 극단적 인 계산 및 업데이트의 순간에 지금까지 가지고 있던 부하에서 40 %이다.

  3. ==============================

    3.이 쇼의 시간이 아닌 사소한 양을했다 지난 50 개 명령 - 먼저 할 일은 slowlog 50을 얻을 볼 (또는 행의 수를 선택)하는 것입니다. 그것은 당신이하고있는 것들 중 일부는 단순히 너무 오래 걸리는 것을 수 있습니다. 나는 보통 며칠마다 항목을 볼 - 나는 slowlog에서 아무것도 볼 수 있을지 걱정. 당신이 지속적으로 항목을 많이보고있는 경우 : 당신은 당신이 실제로 서버에서 무엇을하고 있는지 조사 할 필요가있다. 하지 않을에 대한 하나 개의 킬러 것은 키이지만, 다른 것이있다.

    이 쇼의 시간이 아닌 사소한 양을했다 지난 50 개 명령 - 먼저 할 일은 slowlog 50을 얻을 볼 (또는 행의 수를 선택)하는 것입니다. 그것은 당신이하고있는 것들 중 일부는 단순히 너무 오래 걸리는 것을 수 있습니다. 나는 보통 며칠마다 항목을 볼 - 나는 slowlog에서 아무것도 볼 수 있을지 걱정. 당신이 지속적으로 항목을 많이보고있는 경우 : 당신은 당신이 실제로 서버에서 무엇을하고 있는지 조사 할 필요가있다. 하지 않을에 대한 하나 개의 킬러 것은 키이지만, 다른 것이있다.

    할 다음 일은이다 : 캐시. 그들이 다시 끝을 공격하기 전에 단락받을 요청은 무료입니다. 우리는 광범위 레디 스를 사용하지만, 그것은 우리가 너무 로컬 메모리를 무시 의미하지 않는다.

  4. from https://stackoverflow.com/questions/24317200/how-to-increase-redis-performance-when-100-cpu-sharding-fastest-net-client by cc-by-sa and MIT license