기본 콘텐츠로 건너뛰기

ProxySQL 에서 Unknown system variable 'query_cache_size' 오류

Size of Max Mapped Memory

Size of Max Shared Memory

절대로 심심하지 않다. 해야하는 일이기에 하는 것이다. Linux에서 별다른 세팅이 없으면 32bit 환경에서 최대 4G 메모리를 할당할 수 있으며, 이 중에 1G는 커널, 3G는 사용자에 할당한다. 포인터 크기(sizeof(void*))도 4byte이므로 한 프로세스에서 많이 써봤자 3G 밖에 못 쓴다는 것이다. 실험을 해보면 3G도 못 쓰고 2G 정도 밖에 못 쓴다.

64bit 환경에서 말이 조금 달라진다. 3G 이상 할당을 할 수 있다. 포인터 크기도 8byte인데 뭔들 못 하겠어. ㅡ_-)

언젠가 퍼포먼스 테스트한 것 같은데... 현재 64bit 시스템에서 3기가 할당하고 memset으로 3기가를 초기화 하여 메모리를 실제로 할당 받았다. (리눅스는 메모리 양과 관계 없이 일단 할당해주므로 실제로 할당 받도록 메모리에 접근을 해야한다) 자... 문제는 임의접근(radom access). 절망적이다. 1메가 바이트(1,048,576bytes) 임의접근을 했는데 정말 그지 같은 속도를 자랑(?)한다. Read는 거의 1분에 1% 올라간다. Write는 그것에 비해 2/3 정도 더 느리다. 이렇게 해서는 쓸 수 없다. 중간에 rand()랑 % 연산자랑 if 문이랑 뭐랑 뭐랑 자잘한거 몇개 쓰긴 하지만 이건 너무하다. 해당 작업을 할 때 vmstat을 보면 스왑I/O는 거의 일어나지 않는다. 대신 I/O가 빈번히 일어나는데 아무래도 하드 디스크에서 페이지 올리고 내리고 하니라 그런가보다.
  • 1메가 바이트 임의접근하여 읽는데 걸린 시간: 7,276,902,360 (마이크로 세컨드) - 거짐 2 시간
  • 1메가 바이트 임의접근하여 쓰는데 걸린 시간: 8,251,277,991 (마이크로 세컨드) - 2시간은 가뿐히 넘어주는 센스!!

위에서 3기가 할당한다고 했는데, 약 2.5G 할당한다. 이유는 프로세스가 기본적으로 사용하는 힙, 스택 등의 주소공간을 미리 사용하기 때문이다.

댓글

이 블로그의 인기 게시물

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=&

설치한 패키지에서 RPM 추출하기

오래된 패키지를 관리할 저장소가 없어졌고, 기존 패키지로 다른 서버를 세팅해야할 일이 생겼다면 RPM의 리패키지 기능을 이용해보자. $ rpm -e --repackage [PACKAGE_NAME] 위와 같이 리패키지하면, /var/spool/repackage/ 에 생성한 RPM파일이 있다. :-)