[t:/]$ 지식_

메모리 할당 잡담

2018/02/09

... 공유하기와 더불어 옛생각이 나서 찾아봄..

https://locklessinc.com/benchmarks_allocator.shtml

일단 흔하게 가져다 써볼만한 것으로 jemalloc, hoard가 있다. 속도가 중요한 오픈소스를 받아서 까보면 jemalloc이 빌트인 되어 있는 경우도 있다. 레디스가 그랬던 것 같은데 오래전 일이라 기억은 안난다.

구현을 하거나 넘의 것을 쓴다 만다 판단할 때에는 몇 가지 놓치기 쉬운 고려사항이 있을 것 같다. 문득 주섬주섬 생각나는데로 몇 개만 써보면..

1.

초기단계에서부터 프로파일링과 디버깅을 어떻게 지원할 것인지 생각해봐야 한다.

2.

mmap을 쓸지 말지. 쓴다면 어찌 쓸지.

3.

malloc은 시스템 콜이 아니다. 또한 시스템 콜 호줄은 최소한으로 일어나야 한다. (컨텍스트 스위칭 부하 문제)

4.

자주 쓰는 작은 바이트 단위는 선행해서 통으로 만들어놓고 인덱스만 뽑아서 빡빡 뽑아줘야 한다. 현재 malloc도 그렇게 되어 있는 것으로 안다. 약간 아까워도 패딩으로 붙어있는 바이트의 낭비를 감수한다. 물론 트레이드 오프라서 임베디드 용이거나 멤카피 자체가 부담되는 일이라면 한 바이트라도 쥐어짜야겠지만. 그럼 프리 얼록을 몇 바이트 단위로 얼마나 와꾸를 잡아놓는 것이 좋은가가 문제가 되는데 이는 이미 존재하는 컴퓨팅 환경에서 프로파일링을 하거나 논문 같은 것을 찾아보는 수 밖에 없겠다. 즉슨, 창의와 아이디어와 우수한 코딩 실력만으로 이것을 풀어낼 방법은 음슴. 경험이 있던지 노가다가 필요하다. 아니면 머신러닝으로 요구 될 미래의 청크들을 예측하여 미리 뽑고 있는 방법도?

5.

함수의 콜체인이 짧고 메모리 사용 라이프 싸이클이 매우 짧다면 아예 스택에서 뽑아 쓸 수도 있다. 스택이라 할당 과정이 아예 필요가 없다. alloca도 그렇고 간단한 문자열 연산을 위한 헬퍼 함수들을 만들때 좋다. 스택 오버 플로 걱정은 해야되지만 얼록한 메모리를 릴리즈 해 줄 필요도 없다. 같은 의미에서 아파치 모듈의 브리게이드 메모리 구조는 내용은 모르겠는데 사용자 입장에서 매우 좋다. 메모리 해제를 신경쓰지 않아도 된다. 또는 할당과 동시에 리턴을 받는 함수류가 많다. 응답이 끝나면 알아서 정리된다. 이 정리 비용은 잘 모르겠다. 잘 만들어놨을 것이다. 핳핳핳...

6.

임베디드 리눅스 환경에서 프레임버퍼의 어딘가 어딘가에 블릿버퍼들을 잡고 이를 디바이스로 잡아놓고 추상화를 해 둔 것을 본 적이 있는데 이러면 리드 롸이트 오픈 ioctl을 쓸 수 있지만 이게 다 시스템콜이다. 느리다. mmap을 경유하는 쪽이 당근 좋은데, 최근에 인텔의 뭔가의 보안 버그때문에 mmap이 느려졌다는 이야기를 들었다. 상세한 내용은 모르니 생략.

7.

메모리 사용 계획이 명확하다면 그냥 함수내에 정적 메모리 청크를 만들어놓고 --;; 싱글턴 쓰듯이 할당받아서 -- 쓰기도 한다. 얘는 접근이든 할당이든 속도는 보장해준다. 물론 컴파일 타임 때 이미 메모리 먹고 들어가니 손해는 손해다. 참 이상한 짓거리 많이 했는데 아마도 패턴 책을 보면 뭔가의 이름이 있긴 있을 것 같다.

8.

임베디드에서는 바이트 얼라인을 신경써야 한다. 코텍스부터 하드웨어 얼라인을 지원하는 것으로 알고 있는데 속도 차이는 났던 것 같다. 인텔 계열은 성능 손실이 없다는 실험 결과를 본 적이 있다. 느려진다는 거 미신이니까 믿고 그냥 쓰라고. 코텍스에서 하드웨어 얼라인에 의한 메모리 얼라인 성능 저하 없다면 누군가 알려주세요;;

9.

멀리쓰레드가 들어가고 락이 걸리기 시작하면 완전히 다른 문제가 되는데 보통 실험은 싱글쓰레드로 하기 마련이다. 넘들이 해 둔 멋진 결과들을 참고할 필요가 있겠다;; 요즘엔 CAS나 트랜젝셔널 메모리에 대해서 공부하고 참고할 필요가 있을듯. 그러고보니 NUMA, 거짓 공유를 주의해야 할 것 같다. 메모리 할당 메타 데이터들을 수시로 읽고, 갱신하는데 거짓 공유에 걸려서 모든 코어에 있는 캐시가 깨질 수도 있다.

10.

몇 가지 더 써보려고 간만에 slab을 찾아봤더니. 와.. 1도 기억이 안난다..공부좀 해야겠다. 하지만 난 요즘 파이썬으로 덧셈뺄셈만 하고 있다... 하아..

... 노트처럼 긁적이다보니 술이 안 깬 것 같다...

--- 페이스북 유영천님 글 보다가 쓴 노트 ---

유영천 2월 6일 오후 3:42 · heap memory 자료구조를 만들어서 할당과 해제시 병합 원리를 직접 구현해보면 상당히 공부가 되는데...이걸 아무리 말로 설명해봐야...









[t:/] is not "technology - root". dawnsea, rss