Site icon Re:제로부터 시작하는 개발자 생활

컴퓨터 구매와 ZRAM

근 10년만의 컴퓨터 신규 구매

오랜만에 컴퓨터를 새로 구매했습니다. 물론 전에 중고로 8700을 구매하긴 했었도, 그건 뭔가 아쉬운게 계속 남아 있었기에, 계륵같아져서(사실 게임을 제일 많이 활용했던것 같네요. 8700겜임용으론 참 좋은것 같습니다.). 아무리 찾아봐도, 대기업제품이나 중소기업 완제품에는 제가 원하는 개발용 사양(싸고 좋은)이 없고, 있어도, 뭔가 가격대가 만족스럽지 않아, 조립을 알아봤는데, 조립완제품으로 기획하여 파는것도 영 마음에 안들어서, 조립품 사양구성된것들 중에 기준으로 하나를 잡고 구매한게,

I5-13500, GIGABYTE B760M-DS3H, 삼성 DDR5 기본클럭 32Gx4=128GB, DK1000 케이스였습니다. SSD야 NVME랑, SATA도 여기저기 있던것 쓸거였고, Linux깔아서 쓸터이이기에 구매는 하지 않았습니다만, 조립을 마친후에, 크게 후회한것 하나와, 작은 아쉬움 하나가 생겼습니다.

가장 크게 후회한것은 쿨러.. 네. 인터넷에서 돌던 이야기를 믿는 거였는데, I5정도면 기본 쿨러면 되지 않을까 하는 안일한 생각으로 켜자마자, 마로 당근에서 딥쿨 AG400을 들여와서 바꿨습니다. 정말.. 비행기 소리가 납니다. P코어 6개 E코어 8개라고는 하는데, TDP 65W라서 별 생각 없이 있었는데, 한번 붙였다가 뗀 쿨러에서 왜 그런지 이해가 바로 오더군요. 아래 사진을 보면, 전체 칩 패키지면적의 반도 커버를 못하는 걸로 보입니다.

모자란 접촉면적
모자란 써멀컴파운드

이게 12세대부터라고 했으니, “반드시”. 12세대 이후는 사제쿨러를 써야겠습니다. 특히 요즘 유해하는 타공망이 많은.. 사실 구멍이 슝슝 뚤린 케이스라면 특히 그렇습니다. 이 쿨러라면 서버나 워크스테이션급 무겁고 두꺼운 케이스라면 소음이 작게 들릴 수도 있을 것 같긴합니다. 예전에는 조립시장에서도 강판이 두껍고, 진동이 적으면서 전후 쿨링만 신경썼던 케이스들은 그렇게 소음이 크지 않을 듯도 한데, 요즘은 찾아보기가 힘들고, 비싸더군요.. 물가가 올라서 그럴것 같은데. 혹시나 싶어 옛날 케이스 안 버리길 잘한 것 같습니다. 나중에도 왠지 유용하게 쓰일 것 같습니다. 아니면 중고로 델, HP, 레노보 워크스테이션급 케이스를 들여와서 재활용해 보는 것도 좋을 것 같습니다.

아쉬운것 하나는 DK1000이 나름 조립 편의성도 괜찮고, USB-C Type GEN2x2 프론트 패널을 지원하는데, 보드가 지원을 못하네요.. 가격이 괜찮아서 구매했는데, 딱 요거 하나가 아쉽습니다. 이 프론트 패널은 PCI-E로 확장하는 카드도 해외 아니면 보이지도 않네요. 그리고 그가격 추가면, 메인보드를 다시 사는게 나을 것 같기도 하고요.. 그래서 참 아쉽습니다. 유행처럼 LED는 하나도 없고, 물론 수냉도 아니지만. USB포트 확장성은 쓸일이 참 많아서… 아. 아쉬움이 후회가 되려하고 있습니다.

아무튼 새로 맞추고 이것저것 성능 관련 된 것들 재보고 했는데, 딱 가격만큼 기대를 충족시켜주는 것 같습니다. 성능은 인터넷의 Benchmark점수들, 저는 passmark점수를 주로 기준으로 생각하고 요즘은 단순 7z bench로 비교하곤 하는데, 이전 8700에 비해서 1.5~1.7배정도 성능 향상이 있는 것 같습니다 .Android AOSP full build시 1시간 13분 정도가 나오네요. NVME 990Pro라서, 이부분 제성능을 뽑아주느것과 DDR5라서 좀 성능 이득이 있는 것 같긴하지만. 6p+8E에서 8E쪽은 거의 거들 뿐인 것 같긴합니다.

중고로 7700x로 올라오는데, 가격으로 보면 저게 더 낫지 않았을까 하는 생각도 들지만.. i9급으로 가지않으면 거기서 거기일거라는 생각도 듭니다. 이 이상은 쿨링에 비용이 너무 올라가는 터라, 실제 Android Platform Build등에 필요한 것 대비 비용만 많이 들어가는 것 같고요.

그래서 이젠 주요 투자의 대상이었던 128GB DDR5를 제대로 뽑아보기 위해서 ZRAM을 설치하고 구성해보고 있습니다. 구매를 결심한것도 https://ganadist.github.io/2018_06_02_build_performance_enhancement.html
이분 글을 보고 따라해보고 싶어서였습니다. 실제로 한 시간 이내로 리소스를 최대한 활용해서 완료가 될 수 있다면, 128GB 40만원 정도가 아깝지 않으니까요. 그나저나 램값 많이 싸졌는데, 메인보드 제조사에서 256GB짜리 8소켓짜리 보드좀 내주면 좋겠네요. 그럼 정말 다용도로 많이 활용할 수 있을 것 같은데 말이죠.

ZRAM으로 빌드 산출물 out을 설정

다시 ZRAM이야기로 돌아와서, 설치는 https://www.maketecheasier.com/configure-zram-ubuntu/ 참고하는게 좋아보이고요.

$ apt install zram-config
$ systemctl start zram-config.service 

이렇게 활성화 시켜주면, /dev/zram0으로 장치가 추가됩니다.
위의 블로그 쓰신 분의 시기가 2018년도 6월이므로 5년전, 한 Android P, Q버전 즈음인것 같은데, 현재 Master branch는 U버전이므로, BuildSystem도 다르고(Make->Soong으로 거의 다 전환하고, 다음 단계인 Bazel로 전환하는 시기), 내부 프로젝트도 거의 격변한 상태(많은 모듈들이 Mainline으로 Core Base Framework에서 분리되어서 빌드할 프로젝트 들이 많이 늘고, 분리된 프로세스간 여러 AIDL인터페이스들이 추가되어서 컴파일시에 많은 처리가 필요해짐)라서 결과는 많이 다를 수도 있겠습니다. 현재 AOSP 2.aosp_arm64-eng 빌드로 103GB의 out파일이 튀어 나오니, ZRAM으로 되기는 할것 같습니다.

빌드시에 지켜보면 대략 Peak 50GB정도까지의 RAM이 실제 빌드시에 사용되는 걸(OS전체 시스템 사용량 포함) 목격했기에 대략 70GB 정도의 여유램을 사용할 수 있을 것 같네요. 현재 모든 디스크가 SSD라서 SSD수명을 단축하기 위해서라도 SSD SWAP은 쓸일이 없이 잘 진행되면 좋겠습니다. 설치후 자동으로 약 64GB정도가 잡히네요.

$ cat /proc/swaps
Filename Type Size Used Priority
/swapfile file 2097148 0 -2
/dev/zram0 partition 65788464 0 5
$ free -h
total used free shared buff/cache available
Mem: 125Gi 3.2Gi 117Gi 928Mi 5.0Gi 120Gi
스왑: 64Gi 0B 64Gi

swap으로 쓸건 아니기 때문에, swapoff /dev/zram0 로 swap에서 빼주고,, 깜빡했던, swapfile 도 fstab에서 빼주고 –;; 포맷도 새로하고, mount옵션도 편집하고, 부팅 옵션도 또 편집하고

$ mkdir /mnt/zram
$ mkfs /dev/zram0
$ mount /dev/zram0 /mnt/zram

성능도 살짝 확인해봅니다. 뭔가 잘 나오는 것 같습니다.
/mnt/zram$ sudo dd if=/dev/zero of=benchfile bs=4k count=200000 && sync; sudo rm -f benchfile
200000+0 레코드 들어옴
200000+0 레코드 나감
819200000 bytes (819 MB, 781 MiB) copied, 0.482293 s, 1.7 GB/s

이제 위 사이트에서 나온대로 OUT_DIR을 바꾸고 해봅니다. Android 11인가부터는 CCACHE는 공식적으로 지원 안함으로 되어 있고, 설사 켜더라도 HIT가 하나도 안되어서 오히려 디스크 낭비만 하므로, 빼고 시작해봅니다.

$ export OUT_DIR=/mnt/zram/out
$ m

결과는 87%정도에서 용량 부족으로 멈추네요.

/Virtualization/virtualizationmanager/virtmgr/android_arm64_armv8-a_apex10000/unstripped/virtmgr.d
LLVM ERROR: IO failure on output stream: No space left on device
18:38:21 Failed to write file /mnt/zram/out/build_error: write /mnt/zram/out/build_error.tmp: no space left on
device
18:38:21 Failed to write file /mnt/zram/out/build_progress.pb: write /mnt/zram/out/build_progress.pb.tmp: no sp
ace left on device
[ 87% 142351/162329] //external/crosvm/devices:libdevices rustc src/lib.rs [apex10000]
FAILED: /mnt/zram/out/soong/.intermediates/external/crosvm/devices/libdevices/android_arm64_armv8-a_rlib_rlib-s
td_apex10000/libdevices.rlib

이제 두번째로 dist옵션을 사용해봅니다.

$ m dist

중간쯤 보니 50%정도 진행정도에서 34G사용하고 있네요. 남은용량 25G 아무래도 또 실패할 것 같으니. zram 크기 조정을 위해서 init script를 고치고 재부팅을 할 것을 준비해봅니다. 아래가 초기화 스크립트인데, 이게 서비스 실행시 매번 동작하는 건지는 다시 systemd service설정을 봐야겠네요. 여기세엇 고친다면 아래 mem= 하는 부분을 적절히 조절해주면 되겠고, swap으로는 안쓸거니 disksize write하는 것 제하고, 주석처리하면 될 듯합니다. 간단하게 하려면 그냥 용량만 저기에 써줘도 바로 조절이 될것 같긴하네요. 물론 unmount, 포맷, remount는 다시 해줘야겠지요.

일단 단순하게는 zramctl로 제어가 됩니다.

$ sudo zramctl --size 72G /dev/zram0
$ sudo mkfs /dev/zram0
$ sudo mount /dev/zram0 /mnt/zram
$ df -h
/dev/zram0 71G 24K 68G 1% /mnt/zram

일단 용량은 늘어났으니 이대로 빌드 걸어봅니다.

부팅후 영구 적용은 아래를 참고하면 될 듯 한데, 일단 익숙해지기 위해서 적어만 두고, 수동으로 몇번 해봐야겠습니다.

https://dannyda.com/2022/11/11/how-to-enable-disable-check-temporary-permanent-zram-in-linux-debian-ubuntu-kali-linux-proxmox-ve-pve-etc/

위 사이트대로 module load conf에 적용하는 부분은 미리 적어봤습니다.

$ sudo bash -c 'echo "zram" > /etc/modules-load.d/zram.conf'
$ sudo bash -c 'echo 'KERNEL=="zram0", ATTR{disksize}="72G" RUN="/sbin/mkfs /dev/zram0", TAG+="systemd"' > /etc/udev/rules.d/99-zram.rules'
$ sudo bash -c 'echo "/dev/zram0 /mnt/zram ext4 auto nosuid,node,nofail,x-gvfs-show 0 0" >> /etc/fstab'
아래는 일부 다른 사이트에서 참고했던건데, 혹시 이게 설치되어 동작중이면 이걸 고쳐두면 될것 같고요.
$ sudo vi /usr/bin/init-zram-swapping
#!/bin/sh

modprobe zram

# Calculate memory to use for zram (1/2 of ram)
#totalmem=`LC_ALL=C free | grep -e "^Mem:" | sed -e 's/^Mem: *//' -e 's/  *.*//'`
#mem=$((totalmem / 2 * 1024))
mem=72368

# initialize the devices
echo $mem > /sys/block/zram0/disksize
#mkswap /dev/zram0
#swapon -p 5 /dev/zram0
mkfs /dev/zram0
mount /dev/zram0 /mnt/zram
Exit mobile version