2014-07-15 6 views
3

ppa에서 redis 2.8.12를 설치했지만 시작하지 못했습니다. 이 로그 보면 내가 무엇을 얻을 : 제안하지만 작동하지 않았다으로Redis on Ubuntu 14.04

[4886 | signal handler] (1405388991) Received SIGTERM, scheduling shutdown... 
[4886] 14 Jul 20:49:51.561 # User requested shutdown... 
[4886] 14 Jul 20:49:51.561 * Saving the final RDB snapshot before exiting. 
[4886] 14 Jul 20:49:51.566 * DB saved on disk 
[4886] 14 Jul 20:49:51.566 * Removing the pid file. 
[4886] 14 Jul 20:49:51.566 # Redis is now ready to exit, bye bye... 
[6726] 14 Jul 20:56:04.063 # You requested maxclients of 10000 requiring at least 10032 max file descriptors. 
[6726] 14 Jul 20:56:04.063 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted. 
[6726] 14 Jul 20:56:04.063 # Current maximum open files is 1024. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'. 
       _._             
      _.-``__ ''-._            
     _.-`` `. `_. ''-._   Redis 2.8.12 (00000000/0) 64 bit 
    .-`` .-```. ```\/ _.,_ ''-._         
( '  ,  .-` | `, )  Running in stand alone mode 
|`-._`-...-` __...-.``-._|'` _.-'|  Port: 6379 
| `-._ `._ / _.-' |  PID: 6726 
    `-._ `-._ `-./ _.-' _.-'         
|`-._`-._ `-.__.-' _.-'_.-'|         
| `-._`-._  _.-'_.-' |   http://redis.io   
    `-._ `-._`-.__.-'_.-' _.-'         
|`-._`-._ `-.__.-' _.-'_.-'|         
| `-._`-._  _.-'_.-' |         
    `-._ `-._`-.__.-'_.-' _.-'         
     `-._ `-.__.-' _.-'          
      `-._  _.-'           
       `-.__.-'            

[6726] 14 Jul 20:56:04.064 # Server started, Redis version 2.8.12 
[6726] 14 Jul 20:56:04.064 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 
[6726] 14 Jul 20:56:04.064 * The server is now ready to accept connections on port 6379 

나는 명령 sysctl vm.overcommit_memory=1을 실행하고 재부팅 않았다. 나는이 시점을 정확히 무엇을 할 지 모릅니다. 아무도 아이디어가 있니?

+0

서버가 작동하지 않는 것을 어떻게 결정 했습니까? 마지막 메시지는 서버가 포트 6379에서 수신 중이라는 것을 나타냅니다.이 경우 netstat -anp의 출력을보고 확인할 수 있습니다. – mephi42

+0

@mephi 서비스를 시작했을 때 실패했다는 메시지가 나타납니다 – LouieV

+0

'service redis-server start' 명령을 사용하고 있습니까? 정확한 오류 메시지를 게시 할 수 있습니까? – mephi42

답변

7

오버 커밋 경고가 표시되면 서버가 실행 중입니다. 그러나 데이터베이스 (RDB)를 저장하거나 AOF를 압축하기 위해 다른 프로세스를 포크 할 때 메모리가 쓰기시 ​​복사 오버 헤드를 고려하지 않으면 오류가 발생할 수 있습니다.

레디 스 당신이 커널 매개 변수를 변경 sysctl을 사용할 때 오버 커밋 모드가 그들은 단지 런타임에 변경, 지금 1

로 설정 가진 주장하는 이유입니다. 컴퓨터가 재부팅되었으므로이 변경 사항을 잃어 버렸습니다. 정의를 영구적으로 유지하려면 /etc/sysctl.conf 파일에 추가해야합니다.

오버 커밋 메모리 문제 외에 파일 설명자 수에 관한 문제가 있습니다. 이는 /etc/security/limits.conf 파일 (nofile 매개 변수)을 조정하거나 일부 조건에 따라 세션의 ulimit 설정을 통해 증가시킬 수 있습니다.

1

단순히

sudo echo 1 > /proc/sys/vm/overcommit_memory 

그것은 당신에게 그 오류를 해결할 않습니다. :)

많은 여유 메모리가 있더라도 Linux에서는 fork() 오류로 백그라운드 저장에 실패합니다.

짧은 답변 : 1>/proc 디렉토리/sys 인 에코/VM/overcommit_memory에 :) 이제 긴 하나

그리고

:

레디 스 배경 저장 스키마에 의존 기록 중 복사 포크의 의미 최신 운영 체제 : Redis forks (하위 프로세스 생성)는 부모의 정확한 복사본입니다. 하위 프로세스는 디스크에있는 DB를 덤프하고 마침내 종료합니다. 이론적으로 자식은 부모가 복사 한만큼의 메모리를 사용해야하지만 실제로는 대부분의 최신 운영 체제에서 구현되는 copy-on-write 의미 체계 덕분에 부모와 자식 프로세스가 공통 메모리 페이지를 공유하게됩니다. 하위 페이지 나 상위 페이지에서 변경 될 때만 페이지가 복제됩니다. 이론적으로 자식 프로세스가 저장되는 동안 모든 페이지가 변경 될 수 있기 때문에 Linux는 자식이 얼마나 많은 메모리를 사용하는지 미리 알 수 없으므로 overcommit_memory 설정이 0으로 설정된 경우 fork가 실패 할 때까지는 여유 메모리가없는 한 실패합니다 실제로 모든 부모 메모리 페이지를 복제해야하므로 3GB의 Redis 데이터 세트와 2GB의 사용 가능한 메모리 만 있으면 오류가 발생합니다. overcommit_memory를 1로 설정하면 리눅스가 더 낙관적 인 할당 방식으로 포크를 풀고 수행하는 것으로 나타났습니다. 이것이 실제로 Redis에서 원하는 것입니다. Linux 가상 메모리가 작동하는 방식과 overcommit_memory 및 overcommit_ratio의 다른 대안을 이해하는 좋은 방법은 Red Hat Magazine의 "Understanding Virtual Memory"의 고전입니다. 이 기사는 overcommit_memory에 대한 1 및 2 개의 구성 값을 역전했습니다. 사용 가능한 값의 올바른 의미는 proc (5) 매뉴얼 페이지를 참조하십시오.

출처 : http://redis.io/topics/faq