Memcached - 윈디하나의 솔라나라
|
캐시서비스를 제공해주는 데몬이다. memcache 라는 이름의 라이브러리는 여러가지가 있지만, 여기서 설명하는 건
데몬이다.
키-값쌍으로 메모리에 저장하고 가져오는 기능이 전부이지만, 내부적으로 모든 커맨드는 O(1)에 수렴하는 수행시간을 가진다. 또한 커스터마이징된 슬랩(Slab) 메모리 할당 알고리즘을 사용해 메모리 관리 효율성을 높여 가동시간(uptime)이 늘어나도 성능 저하나 메모리 단편화가 적다.
function get_foo(foo_id) foo = memcached_get("foo:" . foo_id) return foo if defined foo foo = fetch_foo_from_database(foo_id) memcached_set("foo:" . foo_id, foo) return foo endfoo 를 얻어오는 함수의 의사코드이다. 라인번호 기준으로 아래와 같이 작동한다.
데이터 없음으로 간주하고 서비스하면 안된다는 의미다. 캐시는 어디까지나 성능에만 영향을 주도록 설계되어야 한다. 또한 memcached 처리 중에 오류가 발생해도, 서비스 프로세스는 그대로 진행되도록 서비스를 구성하고 프로그래밍해야 한다. 쉽게 말하자면, 운용중인 memcached 프로세스에 이상이 발생해도, 서비스는 (비록 성능이 저하되었더라도) 계속 진행되어야 한다.
# wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
# tar xvfz libevent-2.1.12-stable.tar.gz
# cd libevent-2.1.12-stable
# ./configure \
CFLAGS="-m64 -R/usr/local/ssl/lib -I/usr/local/ssl/include -L/usr/local/ssl/lib" \
CPPFLAGS="-I/usr/local/ssl/include -L/usr/local/ssl/lib"
# vi util-internal.h 1)
...
#define EVUTIL_FALLTHROUGH /* fallthrough */
...
# make
# make install
1) 352번째 라인 부근을 수정한다. cc 로 빌드하는 경우 이부분에서 오류가 발생한다. ifdef 블록 전체를 지우고 EVUTIL_FALLTHROUGH 정의만 남기면 된다. gcc 로 빌드하는 경우에는 할 필요 없다.windy@wl ~/src $ wget https://www.memcached.org/files/memcached-1.6.29.tar.gz windy@wl ~/src $ tar xvfz memcached-1.6.29.tar.gz windy@wl ~/src $ cd memcached-1.6.29 windy@wl ~/src/memcached-1.6.29 $ vi configure 1) CFLAGS="$CFLAGS " // 8526 라인 windy@wl ~/src/memcached-1.6.29 $ ./configure \ --enable-tls \ --enable-sasl \ --enable-dtrace \ --enable-64bit \ --disable-tls 2) vi windy@wl ~/src/memcached-1.6.29 $ make 3) windy@wl ~/src/memcached-1.6.29 $ sudo make install1)
CFLAGS="$CFLAGS -errfmt=error -errwarn -errshort=tags"
부분을 지워야 한다.crc32c.c
는 SSE 4.2 명령셋을 사용하도록 되어있는데, 시스템에서 이를 지원하지 않는 경우 아래와 같이 빌드하자. 시스템에서 SSE 4.2 를 지원하면 하지 않아도 된다. crc32c.c 는 SSE 4.2 를 감지하는 코드가 있으며, 이를 사용해 SSE 4.2 가 없는 경우에도 작동하도록 프로그래밍 되어있기 때문에 이 방법을 사용할 수 있다.
windy@wl ~/src/memcached-1.6.29 $ ./memcached ld.so.1: memcached: fatal: memcached: hardware capability (CA_SUNW_HW_1) unsupported: 0x1000000 [ SSE4_2 ] Killed windy@wl ~/src/memcached-1.6.29 $ isainfo -v 64-bit amd64 applications ssse3 ahf cx16 sse3 sse2 sse fxsr mmx cmov amd_sysc cx8 tsc fpu 32-bit i386 applications ssse3 ahf cx16 sse3 sse2 sse fxsr mmx cmov sep cx8 tsc fpu windy@wl ~/src/memcached-1.6.29 $ file * | grep SSE4_2 memcached: ELF 64-bit LSB executable AMD64 Version 1 [SSE4_2 SSE2 SSE], dynamically linked, not stripped memcached_debug-crc32c.o: ELF 64-bit LSB relocatable AMD64 Version 1 [SSE4_2] memcached-crc32c.o: ELF 64-bit LSB relocatable AMD64 Version 1 [SSE4_2] memcached-debug: ELF 64-bit LSB executable AMD64 Version 1 [SSE4_2 SSE2 SSE], dynamically linked, not stripped windy@wl ~/src/memcached-1.6.29 $ elfedit -e 'cap:hw1 0x1800' memcached windy@wl ~/src/memcached-1.6.29 $ file memcached memcached: ELF 64-bit LSB executable AMD64 Version 1 [SSE2 SSE], dynamically linked, not stripped
Memcrashed라 불리는 UDP DOS 공격에 이용될 수 있다. 이를 방지하기 위해
-l 127.0.0.1
옵션을 사용해 로컬호스트 주소로만 바인딩 하거나, 방화벽을 사용해 memcached 에 외부에서 접근할 수 없도록 조치해 놓아야 한다.
외부에서 접근이 필요한 경우 memcached 1.4.3 버전부터 SASL 를 사용한 인증을 지원하므로 이를 사용하자.
daemon사용자 계정으로, 64MB 메모리를 사용하고, 큰 페이지를 사용하며, 127.0.0.1만 바인드(외부 접속 불가)하는 데몬을 띄운다. PID 파일은
/tmp/memcached.pid
에 있다. 또한 개발자가 추천하는 시범 옵션을 사용하도록 한다.
root@wl ~ # memcached -u daemon -d -m 64 -l 127.0.0.1 -p 11211 -L -P /tmp/memcached.pid -e /tmp/memcached.memory -o modern 1)
1) -o modern
옵션은 memcached 1.4.26부터 지원하는 옵션으로, 시험적인 옵션 중 개발자가 추천하는 옵션들을 활성화하는 옵션이다. 버전마다 개발자가 알맞게 지정해주기 때문에 사용하는 것이 좋다고 생각한다. -e 옵션은 1.5.18부터 추가된 기능으로 종료시 메모리 캐시 내용을 덤프해 놓는 기능이다.memcached 를 종료하려면 kill(1) 명령을 사용해 SIGUSR1
시그널을 전달하면 된다. (-A
스위치를 사용해 memcached 를 실행했다면, shutdown
명령을 주어 종료 할 수 있다)
root@wl ~ # kill -SIGUSR1 `cat /tmp/memcached.pid`
memcached -h
를 사용해 볼 수 있다.
-p <num>
: TCP 포트 번호 (기본값: 11211)-U <num>
: UDP 포트 번호 (기본값: 11211, 0 인경우 사용안함)-s <file>
: UNIX 소켓 경로 (네트워크 지원 안함)-A
: shutdown커맨드 활성화
-a <mask>
: UNIX 소켓 마스크 (기본값: 700)-l <addr>
: 바인드할 주소-d
: 데몬으로 실행-r
: 코어덤프 활성화-u <username>
: 전환할 사용자 이름(루트로 실행시)-m <num>
: 최대 메모리(MB단위, 기본값: 64)-M
: 데이터 저장시 메모리가 부족할 경우 오류를 반환(기본값은 오래된 데이터를 삭제)-c <num>
: 최대 접속 개수 (기본값: 1024)-k
: 페이징된 메모리 락-v
: 로그 보임-vv
: 자세한 로그 보임(slab 할당상태 보임)-vvv
: 매우 자세한 로그 보임-h
: 도움말-i
: 라이선스 보임-V
: 버전 출력 후 종료-P <file>
: PID 파일 저장 위치. -d 옵션 사용시 사용-f <factor>
: 증가 팩터값. (기본값: 1.25)-n <bytes>
: 키+값+플래그를 저장할 최소 단위(기본값: 48)-L
: large memory pages 사용(가능한경우)-D
: 키와 값을 구분하는 구분자 지정(기본값: :(콜론))-t <num>
: 사용할 쓰레드 개수 (기본값: 4)-R
: 이벤트당 최대 요청 수 (기본값: 20)-C
: CAS 비활성화-b
: 백로그 큐 제한(기본값: 1024)-B
: 프로토콜 지정. ascii, binary, auto 중 하나. (기본값: auto)-I <bytes>
: Slab 페이지 크기 제한 1k ~ 128m 범위에서 지정해줄 수 있다. (기본값: 1mb)-F
: flush_all 명령 비활성화-X
: 덤프 비활성화-Y
: 인증 파일-e
: 메모리 파일. SIGUSR1 시그널을 사용해 정지한 경우 메모리 파일을 생성한다. 다음번 시작시 읽어들여 메모리 상태를 종료 직전 상태로 유지할 수 있다.-Z
: TLS/SSL 활성화-o
: 콤마로 구분된 실험적/확장 옵션 활성화. 다음과 같은 옵션이 있으며 자세한 사항은 memcached -h
참조.
약간좋은 것으로 알려져있다.
windy@wl ~ $ telnet localhost 11211 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. stats settings 1) STAT maxbytes 67108864 STAT maxconns 1024 STAT tcpport 11211 STAT udpport 11211 STAT inter 127.0.0.1 STAT verbosity 0 STAT oldest 0 STAT evictions on STAT domain_socket NULL STAT umask 700 STAT growth_factor 1.25 STAT chunk_size 48 STAT num_threads 4 STAT num_threads_per_udp 4 STAT stat_key_prefix : STAT detail_enabled no STAT reqs_per_event 20 STAT cas_enabled yes STAT tcp_backlog 1024 STAT binding_protocol auto-negotiate STAT auth_enabled_sasl no STAT item_size_max 1048576 STAT maxconns_fast no STAT hashpower_init 0 STAT slab_reassign no STAT slab_automove 0 STAT tail_repair_time 3600 END stats slabs STAT 1:chunk_size 80 STAT 1:chunks_per_page 13107 ... STAT total_malloced 47156640 END stats conns STAT 25:addr tcp:127.0.0.1:11211 STAT 25:state conn_listening STAT 25:secs_since_last_cmd 498 STAT 28:addr udp:127.0.0.1:11211 STAT 28:state conn_read STAT 28:secs_since_last_cmd 498 STAT 29:addr udp:127.0.0.1:11211 STAT 29:state conn_read STAT 29:secs_since_last_cmd 498 STAT 30:addr udp:127.0.0.1:11211 STAT 30:state conn_read STAT 30:secs_since_last_cmd 498 STAT 31:addr udp:127.0.0.1:11211 STAT 31:state conn_read STAT 31:secs_since_last_cmd 498 STAT 32:addr tcp:127.0.0.1:33176 STAT 32:state conn_parse_cmd STAT 32:secs_since_last_cmd 0 END set mykey 0 100 2 hi 2) STORED get mykey 3) VALUE mykey 0 2 hi END Ctrl+] telnet> Ctrl+D Connection to localhost closed. windy@wl ~ $1) 세팅 확인
watch
명령을 주면 된다. 모든 모니터링 옵션을 활성화 하려면 watch fetchers mutations evictions
명령을 주면 된다. 아래에서는 fetchers 이벤트에 대해 로깅하고 있다.
windy@wl ~ $ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
watch fetchers
OK 1)
ts=1466693733.115591 gid=49 type=item_get key=solanara_contents_memcached status=not_found
ts=1466693733.156793 gid=50 type=item_get key=solanara_contents_memcached status=not_found
1) OK응답 이후부터 memcached 에 대한 로깅이 시작된다. 만약
ERROR가 발생하는 경우 사용하는 memcached 버전을 확인해보자.
TCP 스펙상 접속을 끊은 후 TIME_WAIT 가 발생할 수 있다. (물론 서버의 TIME_WAIT는 클라이언트에서 ACK를 주지 않은 경우이고 이는 클라이언트의 버그로 볼 수 있긴 하지만 여기서는 논외로 한다) TIME_WAIT 의 개수는 netstat(1M)을 사용해 확인 가능하다. 예를 들어 netstat -na | grep TIME_WAIT | wc -l
명령으로 시스템에 현재 몇개의 TIME_WAIT 가 있는지 확인해볼 수 있다. 자세한건 윈디하나의 솔라나라: IPFilter - netstat 용 상태 변화 차트 (TCP 접속 해제시)를 읽어보자.
TIME_WAIT 가 발생하는 기간은 30 ~ 240 초로 설정할 수 있는데, 대부분의 운영체제에서는 240초가 기본값이다. 하지만 이 값은 memcached 를 운용하는 환경에서는 너무 길다. 트래픽이 많은 곳에서 memcached 와 빈번하게 통신하다 보면, TIME_WAIT가 수만개 이상 발생하는 경우가 있고, 이로인해 memcached 에 접속이 안되는 현상이 발생하는 경우가 있기 때문이다. (어느 정도까지 문제 없는지는 운영체제마다, 설정마다 다르다) 따라서 각 운영체제 마다 이를 줄여주는 옵션이 있다. memcached 를 실행한 서버에서 아래와 같이 30초로 세팅한다. 참고로 일반적인 상황에서는 최소 60초 이상으로 설정할 것을 권장한다.
root@wl ~ # ndd -set /dev/tcp tcp_time_wait_interval 30000 root@wl ~ # export EVENT_NOEVPORT=1
root@wll ~ # vi /etc/sysctl.conf net.ipv4.ip_local_port_range = 16384 65534 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_tw_reuse = 1 root@wll ~ # sysctl -p
C:\>edit tcptimewait.reg [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters] "TcpTimedWaitDelay"=dword:0000001e C:\>regedit /S tcptimewait.reg
slab를 구성해 사용한다. slab 을 사용하는 메모리 관리 기법은 메모리 단편화를 줄이기 위해서인데, memcached 내부에서 일정한 규칙에 의해 slab을 할당해놓지만, 만약 커다란 slab 덩어리가 필요하지 않다면(캐시에 들어가는 객체의 크기를 모두 알고 있다는 전제하에) 필요 없는 덩어리를 피해 할당하면 메모리 사용 효율을 높일 수 있다.
root@wl ~ # memcached -vv slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 120 perslab 8738 slab class 3: chunk size 152 perslab 6898 slab class 4: chunk size 192 perslab 5461 slab class 5: chunk size 240 perslab 4369 slab class 6: chunk size 304 perslab 3449 slab class 7: chunk size 384 perslab 2730 slab class 8: chunk size 480 perslab 2184 slab class 9: chunk size 600 perslab 1747 slab class 10: chunk size 752 perslab 1394 slab class 11: chunk size 944 perslab 1110 slab class 12: chunk size 1184 perslab 885 slab class 13: chunk size 1480 perslab 708 slab class 14: chunk size 1856 perslab 564 slab class 15: chunk size 2320 perslab 451 slab class 16: chunk size 2904 perslab 361 slab class 17: chunk size 3632 perslab 288 slab class 18: chunk size 4544 perslab 230 slab class 19: chunk size 5680 perslab 184 slab class 20: chunk size 7104 perslab 147 slab class 21: chunk size 8880 perslab 118 slab class 22: chunk size 11104 perslab 94 slab class 23: chunk size 13880 perslab 75 slab class 24: chunk size 17352 perslab 60 slab class 25: chunk size 21696 perslab 48 slab class 26: chunk size 27120 perslab 38 slab class 27: chunk size 33904 perslab 30 slab class 28: chunk size 42384 perslab 24 slab class 29: chunk size 52984 perslab 19 slab class 30: chunk size 66232 perslab 15 slab class 31: chunk size 82792 perslab 12 slab class 32: chunk size 103496 perslab 10 slab class 33: chunk size 129376 perslab 8 slab class 34: chunk size 161720 perslab 6 slab class 35: chunk size 202152 perslab 5 slab class 36: chunk size 252696 perslab 4 slab class 37: chunk size 315872 perslab 3 slab class 38: chunk size 394840 perslab 2 slab class 39: chunk size 524288 perslab 2 ...이는 -f 와 -n 옵션을 사용해 변경할 수 있다.
windy@wl ~ $ memcached -vv -f 2 -n 10000 -I 524288 slab class 1: chunk size 10048 perslab 104 slab class 2: chunk size 20096 perslab 52 slab class 3: chunk size 40192 perslab 26 slab class 4: chunk size 80384 perslab 13 slab class 5: chunk size 160768 perslab 6 slab class 6: chunk size 524288 perslab 2 ...memcached 의
stats slabs
명령을 통해 slab 마다 할당되어있는 객체의 개수를 알아낼 수 있다. 각 slab가 꽉 차지 않도록 관리해야 한다.
windy@wl ~ $ telnet localhost 11211 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to wl. Escape character is '^]'. stats slabs STAT 1:chunk_size 96 STAT 1:chunks_per_page 10922 STAT 1:total_pages 1 STAT 1:total_chunks 10922 STAT 1:used_chunks 0 STAT 1:free_chunks 10922 STAT 1:free_chunks_end 0 STAT 1:mem_requested 0 STAT 1:get_hits 0 STAT 1:cmd_set 0 STAT 1:delete_hits 0 STAT 1:incr_hits 0 STAT 1:decr_hits 0 STAT 1:cas_hits 0 STAT 1:cas_badval 0 STAT 1:touch_hits 0 ... STAT 39:touch_hits 0 STAT active_slabs 39 STAT total_malloced 40894464 END
windy@wl ~/src/memcached-1.5.19 $ ./sizes Slab Stats 64 Thread stats -6488 Global stats 168 Settings 312 Item (no cas) 48 Item (cas) 56 Libevent thread 192 Connection 568 ---------------------------------------- libevent thread cumulative 6504 Thread stats cumulative 6312
root@wl ~ # dtrace -l -m memcached ID PROVIDER MODULE FUNCTION NAME 4358 memcached23403 memcached assoc_delete assoc-delete 4359 memcached23403 memcached assoc_find assoc-find 4360 memcached23403 memcached assoc_insert assoc-insert 4361 memcached23403 memcached complete_update_bin command-add 4362 memcached23403 memcached complete_nread_ascii command-add 7650 memcached23403 memcached complete_update_bin command-append 7651 memcached23403 memcached complete_nread_ascii command-append 7652 memcached23403 memcached complete_nread_ascii command-cas 7653 memcached23403 memcached do_add_delta command-decr 7654 memcached23403 memcached process_delete_command command-delete 7655 memcached23403 memcached process_bin_delete command-delete 7656 memcached23403 memcached process_get_command command-get 7657 memcached23403 memcached process_bin_get_or_touch command-get 7658 memcached23403 memcached do_add_delta command-incr 7659 memcached23403 memcached complete_update_bin command-prepend 7660 memcached23403 memcached complete_nread_ascii command-prepend 7661 memcached23403 memcached complete_update_bin command-replace 7662 memcached23403 memcached complete_nread_ascii command-replace 7663 memcached23403 memcached complete_update_bin command-set 7664 memcached23403 memcached complete_nread_ascii command-set 7665 memcached23403 memcached process_bin_get_or_touch command-touch 7666 memcached23403 memcached conn_new conn-allocate 7667 memcached23403 memcached conn_new conn-create 7668 memcached23403 memcached conn_free conn-destroy 7669 memcached23403 memcached dispatch_conn_new conn-dispatch 7670 memcached23403 memcached conn_close conn-release 7671 memcached23403 memcached do_item_link item-link 7672 memcached23403 memcached do_item_remove item-remove 7673 memcached23403 memcached do_item_replace item-replace 7674 memcached23403 memcached do_item_unlink_nolock item-unlink 8559 memcached23403 memcached do_item_unlink item-unlink 8560 memcached23403 memcached do_item_update item-update 8561 memcached23403 memcached do_item_update_nolock item-update 8562 memcached23403 memcached conn_set_state process-command-end 8563 memcached23403 memcached process_command process-command-start 8564 memcached23403 memcached dispatch_bin_command process-command-start 8565 memcached23403 memcached do_slabs_alloc slabs-allocate 8566 memcached23403 memcached do_slabs_alloc slabs-allocate-failed 8567 memcached23403 memcached do_slabs_free slabs-free 8568 memcached23403 memcached do_slabs_newslab slabs-slabclass-allocate 8569 memcached23403 memcached do_slabs_newslab slabs-slabclass-allocate-failed아래와 같이 memcached_watch.d 스크립트를 작성해 DTrace 를 실행하고 위의 프로토콜 예제를 다시 따라하면
command-set fired가 출력될 것이다. Ctrl+C를 눌러 종료한다.
root@wl ~ # cat memcached_watch.d /* TO RUN: dtrace -s memcached_watch.d -p `pgrep -x memcached` -q */ dtrace:::BEGIN { printf("Hit Ctrl-C to end.\n"); } memcached*:::command-set { printf("command-set fired\n"); } root@wl ~ # dtrace -s memcached_watch.d -p `pgrep -x memcached` -q Hit Ctrl-C to end. command-set fired ^C
root@wl /usr/local/mysql/share # mysql -u root < innodb_memcached_config.sql root@wl /usr/local/mysql/share # mysql -u root mysql> install plugin daemon_memcached soname "libmemcached.so"; Query OK, 0 rows affected (0.02 sec) root@wl /usr/local/mysql/share # vi /etc/my.cnf daemon_memcached_option=-p11222위와 같이 설정한 후 서버를 재시작한다. 11222 포트가 열린것을 확인하자.
mysql> use test; mysql> drop table demo_test; mysql> CREATE TABLE demo_test ( c1 VARCHAR(128), c2 text, c3 INT, c4 BIGINT UNSIGNED, c5 INT, primary key(c1) ) ENGINE = INNODB DEFAULT CHARSET=utf8;
root@wl ~ # telnet 127.0.0.1 11222 set a11 10 0 9 123456789 STORED get a11 VALUE a11 0 9 123456789 END quitMySQL 서버를 재시작한다.
root@wl ~ # telnet 127.0.0.1 11222 get a11 VALUE a11 10 9 123456789 END quit캐시 내용이 사라지지 않는다. 기본 세팅을 사용했기 때문에, 데이터는 test.demo_test 테이블에 저장된다. 아래와 같이 저장된 데이터를 쿼리해볼 수 있다.
root@maid ~ # mysql -u root mysql> use test Database changed mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | demo_test | +----------------+ 1 row in set (0.03 sec) mysql> select * from demo_test; +-----+--------------+------+------+------+ | c1 | c2 | c3 | c4 | c5 | +-----+--------------+------+------+------+ | a11 | 123456789 | 10 | 1 | 0 | | AA | HELLO, HELLO | 8 | 0 | 0 | +-----+--------------+------+------+------+ 2 rows in set (0.06 sec) mysql> exit
memcache.java | (717 바이트) |
package test; import java.io.IOException; import java.net.InetSocketAddress; import java.util.HashMap; import net.spy.memcached.MemcachedClient; /** * Memcached Sample. * WindyHana's Solanara - Memcached http://www.solanara.net/solanara/memcached * java test.MemcachedSample */ public class MemcachedSample { /** * 테스트 함수 * @param args */ @SuppressWarnings("unused") public static void main(String[] args) { MemcachedClient c; try { c = new MemcachedClient(new InetSocketAddress("localhost", 11211)); c.set("someKey", 3600, new HashMap<String, Object>()); Object myObjeckt = c.get("someKey"); c.delete("someKey2"); } catch (IOException e) { e.printStackTrace(); } } }
memcache.so
를 생성하고, memcache.php 를 라이브러리 디렉토리에 복사한다.
windy@wl ~/src $ mkdir phpmemcache windy@wl ~/src $ cd phpmemcache windy@wl ~/src/phpmemcache $ /usr/local/php/bin/pecl download memcache windy@wl ~/src/phpmemcache $ tar xvf memcache-2.2.7.tgz windy@wl ~/src/phpmemcache $ cd memcache-2.2.7 windy@wl ~/src/phpmemcache/memcache-2.2.7 $ /usr/local/php/bin/phpize windy@wl ~/src/phpmemcache/memcache-2.2.7 $ CFLAGS="-xc99" ./configure -with-php-config=/usr/local/php/bin/php-config windy@wl ~/src/phpmemcache/memcache-2.2.7 $ make windy@wl ~/src/phpmemcache/memcache-2.2.7 $ sudo cp ./modules/memcache.so /usr/local/php/lib/php/extensionsPHP 7 의 경우 4.0 이후 버전을 사용해 빌드해야 한다.
windy@wl ~/src $ wget http://pecl.php.net/get/memcache-8.0.tgz windy@wl ~/src $ tar xvfz memcache-8.0.tgz windy@wl ~/src $ cd memcache-8.0 windy@wl ~/src/memcache-8.0 $ /usr/local/php74/bin/phpize windy@wl ~/src/memcache-8.0 $ CC="gcc" CFLAGS="-m64" ./configure -with-php-config=/usr/local/php74/bin/php-config windy@wl ~/src/memcache-8.0 $ make windy@wl ~/src/memcache-8.0 $ sudo make install
php.ini
를 수정해 memcache.so
모듈을 로드해야 한다. 윈디하나의 솔라나라: AMP의 PHP 설정를 참조해 extension_dir 을 설정하고 아래와 같이 extension 을 추가해야 한다.
windy@wl ~ $ sudo vi /usr/local/php/lib/php.ini ... extension=memcache.so
정상적으로 로드되었다면 phpinfo()
에서 아래와 같이 보인다.
memc.sess.key
형식으로 정해진다.
windy@wl ~ $ sudo vi /usr/local/php/lib/php.ini session.save_handler = memcache session.save_path = "127.0.0.1:11211"
정상적으로 설정되었다면 phpinfo()
에서 아래와 같이 보인다.
memcache.phps | (534 바이트) |
<?php session_start(); ?> <pre> <?php $presessdata = @$_SESSION["data"]; $_SESSION["data"] = @$_SESSION["data"] + 1; $memcache = new Memcache; $memcache->connect("localhost", 11211); print_r($memcache->getStats()); $items = array( 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3' ); foreach ($items as $k => $v) { $memcache->set($k, $v); } var_dump($memcache->get(array('key1', 'key3'))); var_dump($memcache->get('key2')); var_dump($memcache->get('key4')); ?> SESSION: <?php echo $_SESSION["data"]; ?> </pre>아래와 유사하게 출력되어야 한다.
Array ( [pid] => 16700 [uptime] => 425530 [time] => 1333412724 [version] => 1.4.15 [libevent] => 2.0.20-stable [pointer_size] => 32 [rusage_user] => 6.387770 [rusage_system] => 4.913250 [curr_connections] => 5 [total_connections] => 57 [connection_structures] => 7 [reserved_fds] => 20 [cmd_get] => 148 [cmd_set] => 45 [cmd_flush] => 0 [cmd_touch] => 0 [get_hits] => 100 [get_misses] => 48 [delete_misses] => 6 [delete_hits] => 0 [incr_misses] => 0 [incr_hits] => 0 [decr_misses] => 0 [decr_hits] => 0 [cas_misses] => 0 [cas_hits] => 0 [cas_badval] => 0 [touch_hits] => 0 [touch_misses] => 0 [auth_cmds] => 0 [auth_errors] => 0 [bytes_read] => 66307 [bytes_written] => 36315 [limit_maxbytes] => 67108864 [accepting_conns] => 1 [listen_disabled_num] => 0 [threads] => 4 [conn_yields] => 0 [hash_power_level] => 16 [hash_bytes] => 262144 [hash_is_expanding] => 0 [expired_unfetched] => 0 [evicted_unfetched] => 0 [bytes] => 27437 [curr_items] => 20 [total_items] => 45 [evictions] => 0 [reclaimed] => 0 ) array(2) { ["key1"]=> string(6) "value1" ["key3"]=> string(6) "value3" } string(6) "value2" bool(false) SESSION: 1
memcached의 상태를 볼 수 있다. PHP로 작성되어있다. phpmemcacheadmin
root@wl ~/src # wget http://phpmemcacheadmin.googlecode.com/files/phpMemcachedAdmin-1.2.2-r262.tar.gz root@wl ~/src # cd /usr/local/apache2/htdocs root@wl /usr/local/apache2/htdocs # mkdir memadmin root@wl /usr/local/apache2/htdocs/memcadmin # cd memcadmin root@wl /usr/local/apache2/htdocs/memcadmin # tar xvfz phpMemcachedAdmin-1.2.2-r262.tar.gz root@wl /usr/local/apache2/htdocs/memcadmin # chmod 0777 Config/Memcache.php root@wl /usr/local/apache2/htdocs/memcadmin # chmod 0777 Temp
이후 http://localhost/memadmin에 접속하면 아래와 유사한 화면을 볼 수 있다.
RSS ATOM XHTML 5 CSS3 |
Copyright © 2004-2024 Jo HoSeok. All rights reserved. |