====== memcached ======
* https://memcached.org/
* [[evcache|EVCache]]
* [[https://github.com/memcached/memcached/wiki/ReleaseNotes1518|ReleaseNotes1518 · memcached/memcached Wiki]] 1.5.18 부터 인스턴스 재시작시에도 캐시 내용 유지 가능
===== 분산 캐시 사용시 주의점 =====
* Java 직렬화 기법등을 사용할 경우, 캐시할 클래스의 필드가 달라지면 문제가 발생할 수 있으므로 클래스를 버저닝하고, 클래 버전에 따라 다른 키를 생성하거나 클래스 버전이 다르면 캐시를 안 한 것으로 간주하도록 처리해야 한다.
* 분산 캐시는 내부 망에서의 부하를 유발한다. 대역폭 관리에 신경쓰지 않으면 사용자 폭증시에 웹서버와 DB와 캐시는 모두 CPU 점유율이 낮은데도 불구하고 내부망 대역폭 부족으로 느려지는 상태가 될 수 있다.
===== 설치 =====
* [[https://code.google.com/p/memcached/wiki/NewInstallFromSource|memcached install from source]]
./configure --prefix=/usr/local/memcached
make && make test
sudo make install
===== 설정 =====
* Ubuntu는 ''/etc/memcached.conf'' 파일을 ''/etc/memcached_server이름.conf'' 로 복사하여 설정하면 설정 파일 갯수만큼 서버가 뜬다.
* ''-I 1m'' : 아이템당 메모리 크기를 1mb 로 지정
* [[http://www.alphadevx.com/a/387-Changing-the-maximum-item-size-allowed-by-Memcache|Changing the maximum item size allowed by Memcache]]
* Memcached 1.4.2 이상만 가능하며 그 이하는 1mb 제한.
* ''-m 2048'' : 전체 캐시 사이즈를 2048m으로 지정한다. 이 크기는 **운영체제가 차지하는 메모리 용량을 염두에 두고 스왑을 사용하지 않고서 사용할 수 있도록 지정해야 한다.**
* 가장 기본적인 형태
memcached -p 27012 -m 2048 -d -P /tmp/memcached.pid
* ''-t [Core갯수]'' : 쓰레드 갯수를 지정한다. 기본값은 ''4''이며, 해당 장비의 CPU Core 갯수보다 같거나 작게 설정한다. CPU Core 수 보다 많으면 오히려 성능이 떨어진다.
==== memcached 장시간 사용시 Wasted Memory 증가현상 ====
* memcached를 장시간 사용하면서 키 사이즈가 달라질 경우, 기존 키 사이즈 slab이 할당받은 공간이 wasted 상태로 남고, 그 나머지만 신규 key 용으로 사용하게 되어 메모리 부족이 발생하게 되는 현상
* ''-o slab_reassign slab_automove'' : memcached를 장시간 실행할 경우 slab page 재사용 - beta 기능.
* [[https://github.com/memcached/memcached/wiki/ReleaseNotes1411|Memcached Release Notes 1.4.11]]
* [[http://balodeamit.blogspot.kr/2014/02/slab-reallocation-in-memcache.html|Slab Reallocation in Memcache - 자세한 설명]]
* [[http://lks21c.blogspot.kr/2014/10/memcached-wasted-memory.html|크림슈가도넛의 Cookbooks: Memcached Wasted Memory 제거하는 법]]
==== Linux Memory Swap 방지 ====
[[linux:performance|Linux Performance]]
$ sudo vi /etc/sysctl.conf
vm.swappiness = 0
$ sudo sysctl vm.swappiness=0
===== Telnet 접속 =====
* [[http://www.alphadevx.com/a/90-Accessing-Memcached-from-the-command-line|Accessing Memcached from the command line]]
* [[http://blog.elijaa.org/?post/2010/05/21/Memcached-telnet-command-summary|Memcached telnet command summary - Eli : Memcached, MySQL, Highcharts]]
* [[http://www.lzone.de/articles/memcached.htm|Using the memcached telnet interface]]
===== CAS(Compare|Check and Set) =====
* [[http://neopythonic.blogspot.kr/2011/08/compare-and-set-in-memcache.html|Compare and set in memcached]]
===== extstore - 외부 데이터 저장소 =====
* [[https://memcached.org/blog/nvm-caching/|Caching beyond RAM: the case for NVMe]]
* [[https://github.com/memcached/memcached/wiki/Extstore|Extstore · memcached/memcached Wiki]]
===== Java Client 구현체 =====
* [[http://code.google.com/p/spymemcached/|spy memcached]]
* [[http://code.google.com/p/xmemcached/|XMemcached]] - namespace 지원
* [[https://github.com/gwhalin/Memcached-Java-Client|Memcached-Java-Client]]
===== Version 알아내기 =====
운영중인 Memcached의 버전을 알아내려면 Telnet으로 접속하여 ''version'' 명령을 내리면 된다.
telnet hostname port
version
===== SASL Authentication =====
* [[https://code.google.com/p/memcached/wiki/SASLAuthProtocol|SASLAuthProtocol - memcached - SASL Authentication for Memcached - Memcached]]
* [[https://code.google.com/p/memcached/wiki/SASLHowto|SASLHowto - memcached - HOWTO use SASL auth. - Memcached]]
===== Ubuntu memcached/sasl =====
sudo apt-get install sasl2-bin
sudo saslpasswd2 -a memcached -c [사용자명] # 이후 비밀번호 지정
sudo usermod -a -G sasl memcache
sudo usermod -a -G sasl memcache # memcache 사용자를 sasl 그룹에 추가해야 ''/etc/sasldb2'' 읽기 가능
sudo usermod -g sasl memcache # primary group 으로 변경
sudo su - memcache # memcache 사용자의 group 정보 갱신. 이걸 안하면 reboot 필요
* memcached 실행 옵션에 ''-S'' 추가하고 재시작
* 접속시 꼭 **Binary 프로토콜**로 접속해야 한다.
===== Expired Item =====
Memcached는 아이템이 expire 되더라도 메모리에서 삭제하지 않으며, 새로운 데이터 요청이 들어왔을 때 이미 expire 된 아이템을 대체하는 방식으로 작동한다.
[[http://stackoverflow.com/questions/5986867/how-does-the-lazy-expiration-mechanism-in-memcached-operate|lru - How does the lazy expiration mechanism in memcached operate?]]
> So expired items are only purged when a get request is sent for the expired item or the expired item is cleared because the storage is needed.
===== libmemcached =====
* Ubuntu에서는 ''libmemcached tools'' 패키지 설치
* ''memcslap'' 처럼 이름이 ''memc''로 시작함.
* [[http://libmemcached.org|libmemcached]]
* [[http://docs.libmemcached.org|libmemcached documentation]]
* [[http://docs.libmemcached.org/bin/memaslap.html|memaslap - Load testing and benchmarking a server]]
===== 관리툴 =====
* [[memcached:phpmemcachedadmin|PHP Memcached admin]]
* [[memcached:django-memcache-admin|django-memcache-admin]]
===== 참조 =====
* [[http://dom.as/2008/12/25/memcached-for-small-objects/|Memcached for small objects]]
* [[http://www.ibm.com/developerworks/kr/library/os-memcached/|IBM DW memcached를 적용하여 사이트 성능 향상]]
* [[http://www.javaworld.com/javaworld/jw-04-2012/120418-memcached-for-java-enterprise-performance.html|Use Memcached for Java enterprise performance, Part 1: Architecture and setup]] [[http://www.javaworld.com/javaworld/jw-05-2012/120515-memcached-for-java-enterprise-performance-2.html|2]]
* [[https://github.com/twitter/twemcache|twemcache]] : memcached/redis proxy
* [[http://software.intel.com/en-us/articles/enhancing-the-scalability-of-memcached|Enhancing the Scalability of Memcached | Intel® Developer Zone]]
* [[https://code.google.com/p/memcached/wiki/NewStart?tm=6|Memcached Wiki]]
* [[https://code.google.com/p/memcached/wiki/NewCommands|Memcached Protocol Commands]]
* [[http://www.solanara.net/solanara/memcached|Memcached - 윈디하나의 솔라나라]]
* [[http://helloworld.naver.com/helloworld/textyle/151047|hello world » Memcached의 확장성 개선]]