개발

Redis 튜닝하기

snow-line 2020. 7. 27. 22:31
반응형

1. Redis 메모리 운영 효율적으로 관리하기

- Redis는 in-memory 데이터 저장 관리 기술을 제공합니다.

- 그러나 시스템 메모리 크기는 제한이 있습니다.

- 사용자가 저장하는 데이터는 이보다 훨씬 크기 때문에 모든 데이터를 메모리에 저장해서 관리할 수가 없습니다.

- 이러한 문제점을 개선하기 위해 Redis는 LRU / LFU 알고리즘을 제공합니다.

- 메모리를 효율적으로 사용하기 위해서 LFU 알고리즘으로 설정해서 사용하는걸 추천합니다.

 

* LFU 알고리즘 설정

vi redis.conf
 
 
lfu-log-factor 10 // LFU 알고리즘에 의한 메모리 운영
lfu-decay-time 1

- LRU 알고리즘은 lfu-log-factor 값을 변경하면서 튜닝하는데 기본값은 10입니다. (일반적으로 10이 가장 효율적)

- Redis에 쓰기 작업이 계속 발생하면 최대 메모리에 도달하게 되는데 이때 키에 삭제 작업을 수행하게 되면 성능 지연이 발생합니다.

- 이러한 문제를 해결하기 위해 LazyFree 쓰레드를 이용합니다.

vi redis.conf
 
 
lazyfree-lazy-eviction yes // unlink로 삭제하고 새 키 저장
layfree-lazy-expire yes // unlin로 만기된 키 삭제
lazyfree-lazy-server-del yes // unlink로 데이터 변경
slave-lazy-flush yes // 복제 서버가 삭제 후 복제할 때 FlushAll async 명령어로 삭제

 

2. Redis 클라이언트

 - 클라이언트는 주로 Jedis, Redisson, Lettuce 3가지 중에서 Jedis와 Lettuce를 많이 사용합니다.

 - 성능 측면에서 Lettuce가 Netty 기반으로 만들어져서 비동기로 요청을 처리하기 때문에 Jedis보다 더 빠르므로 Lettuce를 사용합니다.

  TPS Redis CPU Redis Connection 응답 속도
jedis no connection pool 31,000 20% 35 100ms
jedis use connection pool 55,000 69.5% 515 50ms
lettuce 100,000 7% 6 7.5ms

 

3. Redis Lettuce 클라이언트 설정

 - Redis를 사용하기 위해 Maven 설정을 합니다.

pom.xml에 Redis 개발 설정

 - Redis 설정 정보

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
public class RedisConfig {
 
    private String redisHost = "1.2.3.4";
    private int redisPort = 6379;
 
    //  redis 연결
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(this.redisHost, this.redisPort);
    }
 
    @Bean
    public ConfigureRedisAction configureRedisAction() {
        return ConfigureRedisAction.NO_OP;
    }
 
    //  redis template 생성
    @Bean
    public StringRedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
        stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
        stringRedisTemplate.setValueSerializer(new StringRedisSerializer());
 
        stringRedisTemplate.setHashKeySerializer(new StringRedisSerializer());
        stringRedisTemplate.setHashValueSerializer(new StringRedisSerializer());
        return stringRedisTemplate;
    }
}

 

4. Redis 성능 튜닝하기

 - 성능 튜닝 포인트는 System, Query, Server 튜닝이 있습니다.

 - Redis는 인-메모리 기반 데이터 저장 구조로 시스템 RAM 영역을 할당받아서 사용하기 때문에 System 튜닝이 가장 중요합니다.

 

 

1) System 튜닝하기

  - Block-Size : 기본값은 8kb 입니다. 동시 접속자가 많고 Redis에 CRUD가 빈번하게 발생하면 4kb로 변경하고, 동시 접속자가 적고 조회 위주로 Redis를 사용하면 16kb로 변경합니다.

 

 - tcp keep alive time 을 변경합니다.

vi /etc/sysctl.conf
 
net.ipv4.tcp_keepalive_time = 7200

- 시스템 환경 설정을 변경합니다.

vi /etc/sysctl.conf
 
 
vm.overcommit_memory=1 sysctl -w net.core.somaxconn=65535
cat /proc/sys/net/core/somaxconn
 
 
vi /etc/sysctl.conf
 
 
net.core.somaxconn = 65535
 
 
vi /etc/security/limits.conf
 
 
redis soft nofile 65536
redis hard nofile 65536
redis soft nproc 131072
redis hard nproc 131072

 

2) Slow Query 튜닝하기

 - Slow 쿼리를 튜닝하기 위해서는 우선 쿼리 수집을 한 후 분석하여 적합한 데이터 구조를 사용해야 합니다.

lowlog get 저장된 키 // 해당 키 값으로 쿼리 호출
 
 
slowlog len // Slow Query 개수
 
 
slowlog reset // 저장된 모든 slow Query 제거

 

3) Server 튜닝하기

- 스와핑 발생 빈도 줄이기 위한 설정 변경

vi redis.conf
 
maxmemory 1000000000 // RAM 메모리가 허용하는 최대 범위(전체 RAM 크기의 90% 값으로 설정)
swap 0 1 // Database 1에 설정한 swap DB 0

 

반응형

'개발' 카테고리의 다른 글

AngularJs 보안 가이드  (0) 2020.07.28
AngularJs 성능 개선 가이드  (0) 2020.07.28
프리랜서 계약서 양식  (0) 2020.07.27
IntelliJ Memory Option 최적화  (0) 2020.07.26
Intellij Freezing(인텔리J 프리징) 현상 해결  (0) 2020.07.26