시작하며..
리눅스 RAM 디스크에서 자바 컴파일(ant/ivy)하면 얼마나 성능을 향상시킬 수 있을까 고민을 해봤다.
빌드할 때 file io 를 줄이고, jvm 구동시간을 줄이면 어떨까 하는 생각으로 시도해보았다.
램디스크를 쓰면, 일반 하드디스크를 쓰는 것에 비해서 성능이 20배이상 좋다는 블로그 (http://forums.bukkit.org/threads/harddrive-vs-ramdisk-vs-tmpfs-benchmark.2710/) 와 10분 걸렸던 빌드가 5분이면 되었다는 블로그(어딘지 못찾고 있음)을 보았다.
10초 내 외의 빌드 시간이 짧은 프로젝트들이 수백 개가 있는 상황에서 램디스크를 활용하면 속도가 향상될지 테스트해보았따.
본론
리눅스에서 RAM 디스크를 사용하는 방법이 두가지이다. ram 디스크과 tmpfs 이다.
1. 램디스크 이용하기 (ramdisk)
/dev/ram* 을 이용해서 9M짜리 램디스크 잡아본다. (9216 = 9*1024M)
]# mkfs -t ext3 -q /dev/ram1 9216
]# mkdir -p /ramdisk
]# mount /dev/ram1 /ramdisk
]# df -H | grep ramdisk
]# df -H
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 11G 3.5G 7.0G 34% /
/dev/sda3 278G 2.7G 261G 1% /home
tmpfs 6.3G 0 6.3G 0% /dev/shm
/dev/ram1 8.2M 1.2M 6.7M 15% /ramdisk
영구히 쓰려면, 커널을 수정 하거나 grub 설정을 변경해야 한다. 많이 귀찮은 작업이 있다. 잘못하면 OS 부팅이 안되고, 함부로 리눅스 서버를 리부팅할 수 없는 상황이라 간단하게 mount 방식을 이용했다.
]# mkdir –p /ramfs
]# mount -t ramfs -o size=1G,mode=777 ramfs /ramfs
2. tmpfs 를 이용
tmpfs는 임시적으로 파일을 ram을 이용하는 방식이다. 내가 사용하는 centos 5.3 64비트에는 다행히 tmpfs를 지원한다.
]# grep tmpfs /proc/filesystems
nodev tmpfs
]# mkdir /tmpfs
]# mount -t tmpfs -o size=1G,mode=777 tmpfs /tmpfs
]# df -H
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 11G 3.5G 7.0G 34% /
/dev/sda3 278G 2.7G 261G 1% /home
tmpfs 6.3G 0 6.3G 0% /dev/shm
/tmpfs 1.1G 0 1.1G 0% /tmpfs
3. 비교
빌드에 대한 객관성을 유지하기 위해서 캐쉬가 된 부분을 모두 포함한 것이다. ant와 java는 모두 하나의 파일시스템안에 넣었다. 테스트 결과는 다음과 같다.
디스크 | tmpfs | ram disk (mount방식) | |
xeon 5148 2.33GHz 4개, ram : 8G | A 소스 : 14 s B 소스 : 11s | A 소스 : 18 s B 소스 : 11s | X |
xeon L5640 2.27Ghz] 12개, ram :12G | A 소스 : 14 s B 소스 : 9s | A 소스 : 14 s B 소스 : 9s | A 소스 : 14 s B 소스 : 9s |
* 특이한 것은 램에서 돌리는 것이 가장 빠른 것은 아닌 것 같았다. 18초가 나오는 경우도 있었다.
정확한 이유는 알 수 없지만… (어디선가 바틀렉이 있는것 같다.. 잘 찾아봐야지.)
마치며..
시간을 체크해보 전체 빌드 시간 중 java 컴파일에 해당되는 시간은 상당히 적었다. 연동이나 ivy 연동부분이나 javascript 작업등으로 인해서 길었던 부분이 있었다. 따라서 file io 이슈나 java 시작 시간은 큰 문제가 아니다. 오히려 컴파일 이슈가 큰 녀석이나 해당되는 것 같았다.
확실히 몇 분 단위의 빌드시간이 되어야 RAM 디스크를 이용 하는게 나을 것 같다. 빌드시간이 10초 내외의 수백개의 프로젝트를 빌드할 때는 병렬처리 및 클러스터링 빌드 방식이 더 나은 것 같다.
'general java' 카테고리의 다른 글
[이클립스 / STS] maven builder 변경 (2) | 2012.01.12 |
---|---|
[이클립스] maven3 - maven-antrun-plugin 컴파일 에러 Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin (1) | 2012.01.12 |
카산드라(Cassandra)의 mmap 사용 이슈 및 처리 방법 (0.6.5 변경 내용) (0) | 2012.01.05 |
자바 RandomAccessFile 클래스의 map 메서드 내부 구조 분석 (0) | 2012.01.04 |
JAXB 잘 사용하기 (1) | 2011.12.21 |