Nginx 에서 KeepAlive 관련된 설정은 다음과 같이 세가지이다. keepalive_disable keepalive_timeout keepalive_requests 먼저, Keepalive 는 HTTP 와 TCP 상에서 구현되어 있다. HTTP 의 경우에는 1.0 버전과 1.1 버전이 존재하는데, 1.0 버전에서는 KeepAlive 는 존재하지 않으며 1.1 에서는 연결시에 기본으로 KeepAlive 가 활성화 된다. HTTP 는 “Connetionless” 방법을 취한다. 웹 컨텐츠를 전송 받기 위해서 서버에 연결을 한 후에 데이터를 전송받는다. 그리고는 연결을 바로 끊게 된다. 하지만 웹이라는게 HTML, Javascript, CSS, Image 파일등으로 수백개로 이루어진 상태에서 수백의 컨텐츠를 전송하기위해서 연결을 수백번을 한다면 비 […]
[번역]레디스 슬레이브에서 “놓쳐버린” 키들.
이 문서는 다음의 글을 번역한 것입니다. “Missing” Keys on Redis Slaves 레디스 슬레이브에서 “놓쳐버린” 키들. 만약 당신이 레디스(Redis)에서 만료중인 키를(expiring key)(“임시적인 키”로 알려진) 사용하고 있다면, 당신은 레디스 마스터에서 새로운 슬레이브(Slave)를 붙였을때에 놀랄 수도 있습니다. 슬레이브에서 키 갯수(key count)가 마스터에서 키 갯수보다 약 25%정도 낮을 것입니다. 이것은 임시적인 키(volatile key)가 아주 많다면 특별하게도 정상적인 것입니다. 레디스 슬레이브가 키를 놓쳐버린 걸까? 단순하게 데이터를 잃어버린 걸까? 결론부터 말하자면 “아니오” 입니다. 그러나, 왜그런지 이해하길 희망하면서, 레디스 슬레이브가 어떠한 데이터도 잃어버리지도 않았는데도 더 적은 키 […]
Redis 운영에 필요한 잡지식들.
Redis 는 In memory 기반으로 동작하기 때문에 메모리 관리가 매우 중요한데, 먼저 리눅스에 메모리 관리를 Redis 운영에 적합하도록 설정하는 것이 좋다. 먼저 Redis 는 Swap 을 사용하지 않고 물리 메모리 내에서만 운영하는 환경이다.
|
1 2 3 4 5 |
vm.overcommit=2 vm.overcommit_ratio=99 vm.swappiness=0 echo never > /sys/kernel/mm/transparent_hugepage/enabled |
가상 메모리 overcommit 에 대해서 2 로 설정하는 것이 좋다. 2로 설정하게 되면 리눅스가 사용가능한 메모리는 다음과 같이 계산한다.
|
1 |
swap + (physical memory * overcommit_ratio) |
예를들어 32GB 물리 메모리를 가지고 있고 overcommit_ratio 가 50%라면 16GB 물리 메모리만 사용하게 된다. 그래서 overcommit_ratio 를 99% 로 설정을하면 모든 메모리를 사용하게 된다. swappiness 는 […]
Python redis 테스트 스크립트.
랜덤으로 키를 생성해서 값을 넣도록 만든 Python redis 테스트 스크립트.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#!/usr/bin/env python from multiprocessing import Process import redis import random import string import time def id_generator(size=6, chars=string.ascii_uppercase + string.digits): return ''.join(random.choice(chars) for x in range(size)) data = id_generator(12, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()") def g(idx): r_server = redis.Redis('localhost') for i in xrange(idx * 1024 * 1024 * 2, (idx+1)*1024*1024 * 2): key = 'PR%s'%(id_generator(random.randrange(6,15), "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()")) if random.randrange(1,100) > 70: r_server.setex(key, id_generator(random.randrange(128,1024), "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()"),random.randrange(1,350)) print "expire key: %s" % key else: r_server.set(key, id_generator(random.randrange(128,1024), "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()")) print "permanent key: %s" % key time.sleep(0.2) if __name__ == '__main__': pids = [] for i in xrange(80): p = Process(target=g, args=(i,)) pids.append(p) p.start() for pid in pids: pid.join() |
tomcat jmx 소스
JMX 소스
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.openmbean.CompositeData; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import java.io.Console; public class check_jmx { public static final char ESC = 27; public static void main(String[] args) { // TODO Auto-generated method stub try { // Create an RMI connector client and // connect it to the RMI connector server // JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:9999/jmxrmi"); JMXConnector jmxc = JMXConnectorFactory.connect(url, null); MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); ObjectName tomcatThreadPoolObh = new ObjectName("Catalina:type=Executor,name=tomcatThreadPool"); Object activeCnt = mbsc.getAttribute(tomcatThreadPoolObh, "activeCount"); ObjectName memoryObh = new ObjectName("java.lang:type=Memory"); CompositeData memoryRes = (CompositeData) mbsc.getAttribute(memoryObh, "HeapMemoryUsage"); Console c = System.console(); if (c == null) { System.err.println("no console"); System.exit(1); } // clear screen only the first time c.writer().print(ESC + "[2J"); c.flush(); Thread.sleep(200); for (int i = 0; i < 100000; ++i) { // reposition the cursor to 1|1 c.writer().print(ESC + "[1;1H"); c.flush(); //c.writer().println("hello " + i); c.writer().println("activeCount = " + activeCnt); c.writer().println("HeapMemoryUsage committed = " + memoryRes.get("committed")); c.writer().println("HeapMemoryUsage init = " + memoryRes.get("init")); c.writer().println("HeapMemoryUsage max = " + memoryRes.get("max")); c.writer().println("HeapMemoryUsage used = " + memoryRes.get("used")); c.flush(); Thread.sleep(5000); } /* echo("activeCount = " + activeCnt); echo("HeapMemoryUsage committed = " + memoryRes.get("committed")); echo("HeapMemoryUsage init = " + memoryRes.get("init")); echo("HeapMemoryUsage max = " + memoryRes.get("max")); echo("HeapMemoryUsage used = " + memoryRes.get("used")); */ jmxc.close(); } catch (Exception e) { e.printStackTrace(); } } private static void echo(String msg) { System.out.println(msg); } } |
Redis 설치하기
Redis 는 Key-Value 로 데이터를 저장하는 NoSQL 서버 입니다. In Memory 기반으로 동작하기 때문에 빠른 응답속도를 보입니다. 이 문서는 Redis 설치에 관한 문서 입니다. 다운로드
|
1 |
wget http://download.redis.io/releases/redis-2.8.19.tar.gz |
의존성 패키지 설치 CentOS 의 경우에는 다음과 같이 설치를 해줍니다.
|
1 2 3 |
yum install gcc.x86_64 gcc-c++.x86_64 wget.x86_64 bzip2-devel.x86_64 pkgconfig.x86_64 openssl-devel.x86_64 make.x86_64 man.x86_64 nasm.x86_64 gmp.x86_64 gdbm-devel.x86_64 readline-devel.x86_64 compat-readline43.x86_64 ncurses-devel.x86_64 db4-devel.x86_64 automake* autoconf* pcre-devel.x86_64 -y yum install tcl-devel.x86_64 tcl.x86_64 |
Ubuntu 의 경우에는 다음과 같이 설치를 해줍니다.
|
1 2 3 |
sudo apt-get install build-essential sudo apt-get install tcl8.5 |
컴파일
|
1 |
make |
설치 설치는 PREFIX 를 인자로 줘서 설치 디렉토리 위치를 지정해줄 수 있습니다.
|
1 |
make install PREFIX=/usr/local/redis |
Redis 의 설치는 오로지 실행파일들만 복사해 줍니다. 설정 Redis 는 설치 후에 각종 설정을 할 수 있도록 스크립트를 지원 […]
JMX 로 Tomcat 모니터링 하기.
톰캣(Tomcat)은 JEE의 Web Container 의 구현에 입니다. 흔히 WAS 서버라고 하죠. 많은 기능이 있지만 이번에는 JMX를 설정하고 이를 이용해서 Tomcat 을 모니터링 해보겠습니다. JMX는 Java Management eXtension 으로 자바 서비스들을 관리하고 모니터링하기위한 API를 제공하는 기능을 포함하는 기술입니다. Tomcat 오 자바 서비스의 일종임으로 JMX를 이용할 수 있습니다. 톰캣(Tomcat)의 경우에 아쉽게도 기본 배포본에 이를 위한 라이브러리가 포함되어 있지않아 이 기능을 이용하기 위해서는 톰캣용 JMX 라이브러리를 다운받고 톰캣을 재시작 해줘야 합니다.
|
1 2 |
# 톰캣버전에 맞는 JMX 를 다운받으시길 바랍니다. http://apache.mirror.cdnetworks.com/tomcat/tomcat-7/v7.0.57/bin/extras/catalina-jmx-remote.jar |
이 파일을 톰캣(Tomcat) 라이브러리 디렉토리인 lib 에 넣어줍니다. 그리고 톰캣(Tomcat)시작 스크립트에 […]
Cassandra 2.1.2 설치하기.
카산드라(Cassandra)는 분산 데이터 스토리지 시스템 입니다. 아파치 재단에서 오픈소스로 만들어 배포하고 있고, 자바기반으로 제작되었습니다. peer to peer 프로토콜을 이용한 고가용성이 구현되어 있습니다. 이 문서는 카산드라(Cassandra) 2.1.2 에 싱글(Single) 노드를 위한 설치에 대한 것입니다. 설치환경은 CentOS 입니다. jdk 7 update 75 카산드라(Cassandra) 2.1.2 는 jdk 7 update 75 버전 이상을 필요로 합니다. 만일 idk 버전 이하를 사용한다면 시작스크립트에서 오류를 내며 작동하지 않습니다. Oracle 홈페이지에서 jdk 7 update 75 를 다운받아 다음과 같이 압축을 해제합니다.
|
1 2 3 |
tar xvzf jdk-7u75-linux-x64.tar.gz -C /opt cd /opt ln -s jdk1.7.0_75 jdk |
카산드라(Cassandra) 2.1.2 설치 카산드라(Cassandra) 는 […]
Windows 10 테크니컬 프리뷰
Windows 10 Techincal Preview 가 1월 21일 나왔습니다. 이번 프리뷰는 컨슈머를 위한 것으로 지난해 10월에 발표한 프리뷰에 이은 두번째 공개입니다. Windows10 은 Windows 8.1 에 뒤를 이어 출시되는 MS 사의 운영체제로 관심을 모으고 있습니다. Windows 8.1 이 모바일 디바이스와 데스크탑을 통합하려고 했던 것이였는데 결과적으로 실패였다는 평가가 많았습니다. 데스크탑시장에서는 Windows 7 이 여전히 안정적이게 동작하고 많은 사용자를 확보해놓은 상태였고 Windows 8.1 을 탑재한 모바일 디바이스의 판매도 부진했습니다. 그래서 그런지 몰라도 이번에 Windows 10 에서는 기존 데스크탑으로 우선 포커스를 맞춘 느낌입니다. 기존의 […]