Gccemacs를 (당분간) 포기했다

마지막 업데이트: 2022년 6월 3일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
유니레벨 계보도 커스텀

텍스트 파일 vs 바이너리 파일

텍스트 파일이란 글자들이 씌어 있는 파일이다. 사람이 눈으로 직접 내용을 읽을 수 있다. 텍스트 파일은 아스키(ASCII) 파일이라고도 한다. 대부분의 텍스트 파일이 아스키(ASCII)코드로 글자들을 나타내기 때문이다. 대표적인 확장자는 txt, c, cpp, bat, java, html, xml, css 등이 있다.

  1. 단순히 텍스트 편집기만으로 리소스 파일을 생성, 수정 할 수 있다.
  2. 쉽게 파일의 내용을 살펴볼 수 있어서 디버깅이 쉽다.

바이너리 파일이란 ‘0’ 과 ‘1’ 을 이용한 2진수 데이터 만으로만으로 이루어진 파일이다. 사람이 직접 읽을 수 없다. 대표적인 확장자는 exe, dll, zip, rar, mp3, mpg, jpg, png 등이 있다.

  1. 데이터를 처리하고 전송하는데 일반적으로 비용이 적게 든다.
  2. 보통 텍스트에 비해서 파싱이 쉬워서 데이터 처리 속도가 빠르다.
  3. 필요한 데이터 공간도 더 작은 경우가 많다.

일반적인 경우 텍스트 포멧을 사용하고, 효율적인 데이터 처리나 전송 처리가 필요한 경우에 바이너리를 사용하는것이 좋다.

예를들어 텍스트 파일과 바이너리 파일 2개가 있는데 내용은 정수형 데이터가 구분자를 포함하여 아~~주 많이 열거되어 있다고 하자.

파일안의 정수들을 모두 합하는 처리를 해야 한다면, 어느 파일이 더 빠르게 처리 할 수 있을까?

예상대로 바이너리 파일이 더 빠르게 처리 할 수 있을것 같다. 이유는 텍스트 파일의 경우 숫자 하나가 8bit 의 아스키 코드로 이루어져 있어서 정수형 데이터 하나가 몇 bit 로 이루어 졌는지 탐색하는 비용이 클것 같다. 하지만 바이너리 파일의 경우 정수형 데이터 하나는 4bit 으로 고정되어 있어서 offset 값을 옮겨가면서 합을 구하면 더 빠르게 처리가 될것 같다.

gccemacs를 (당분간) 포기했다

gccemacs를 쓰는 것은 퍼포먼스 때문이었다. 해당 OS의 바이너리 포맷으로 컴파일하는 Native Compilation 기능은 당연히 바이트 컴파일만 된 스크립트보다 로딩 및 파싱이 빨라야 한다. 컴파일하는 시간이 오래 걸린다는 점을 제외하곤 모든 것이 좋으리라 생각했다.

macOS에서 gccemacs 설치하기(feat. emacs-plus)

Homebrew를 통해 설치할 수 있는 이맥스(Emacs) 중 몇 안 되는 GUI가 제대로 돌아가는(?) 프로젝트인 emacs-plus에서 오랜 시간 동안 native-comp 즉 gccemacs를 지원하기 위한 논의와 개발이 있었다. 한참을 지.

물론 시작부터 단점이 있었다. 아직 Emacs 28 버전에서만 지원된다는 점이 있다.

그런데 이건 사실 별로 문제가 되지 않는다.

더 큰 문제는 어이없게도 로딩이 매우 느리다는 점이다. 아니 잠깐, 바이너리로 컴파일했다면 로딩이 압도적으로 빨라야 맞는 게 아닐까? 하지만 불행히도 내가 사용하는 설정인 Doom Emacs의 로딩은 Native Compilation 쪽이 수 배는 더 오래 걸렸다.

다만 로딩 문제는 Emacs 28이 아직 베타라 그럴지도 모른다.

그렇다고 하더라도 더 큰 단점을 찾게 되었다. 바로 바이너리 컴파일 그 자체의 문제 말이다.

어떤 상황에서 어떤 확장이 필요로 하는 외부 기능이 있다. 확장의 Elisp 코드에서 외부 패키지나 라이브러리를 가져와서 사용하는 경우다. 당연히 있을 수 있는 일이다. 다르게 표현하자면 컴파일된 스크립트에 외부 패키지 의존성이 생긴다는 말이다.

이 말은 의존성 패키지를 삭제하거나 업그레이드 하는 등 의존성이 깨지게 되면 그걸 링크해서 사용하던 바이너리는 에러가 발생한다는 말이 된다. 실제로 나는 brew upgrade 명령을 실행한 후 내 Emacs의 몇몇 명령이 오류를 일으키는 경우를 종종 봐왔다. 라이브러리를 못 찾거나 별도의 에러가 있거나 나타나는 증상은 다양했지만 어쨌든 결과적으로 에러로 이어졌다.

결국 brew upgrade 명령을 쓸 때는 긴장을 하게 될 수밖에 없었다. 그러다 문제가 생기면 해당 확장만 삭제하고 다시 빌드하거나 혹은 원인을 못 찾아서 Doom Emacs 자체를 완전히 새로 설치하기도 했다. 물론 시간은 시간대로 버리고 말이다.

지나친 긴장은 당연히 스트레스를 유발한다. 불행히도 생각보다 자주 의존성 패키지 업데이트가 올라왔다. 이 잦은 스트레스를 참으며 견디며 순응하는 것이 맞는 것일까? 아니면 포기하는 것이 더 유익한 행위일까?

나는 포기하기로 했다.

마음에 안 들게 튜닝된 도구에 순응하는 것은 그다지 유쾌하지 않은 것 같다. 그래서 모든 것을 기본 상태로, 모든 것을 안정 버전으로 다시 돌아가기로 했다. 아직 Emacs 안정 버전은 27.2다. 당연히 Native Compilation은 지원되지 않는다.

사실 내 Emacs의 시작 화면은 빈 화면이지만 썰렁한 것 보단 이게 나을 것 같다

효과는 굉장했다. 굉장히 속이 편해졌다. 그것뿐인가. 로딩 속도도 무지 빠르다. 말 그대로 개빠르다. Doom Emacs의 설치 및 빌드 속도도 엄청나게 빨라졌다.

그리고 대망의 실제 사용 퍼포먼스는 의외로 달라진 것이 없게 느껴졌다. 혹시 나는 gccemacs를 잘못 사용하고 있었던 것일까? 그렇다 할지라도 너무나 쾌적하게 느껴졌다.

Native Compilation 기능이 곧 메인에 들어갈 것이라는 소식이 들리기도 한다. 많이 안정화가 되어가나 보다. 그렇다고 할지라도 내가 과연 다시 Native Compilation을 사용할까는 아직 의문 투성이다. 바이너리 컴파일의 단점이라는 쓴 맛을 보았더니 이렇게 가치관이 바뀌게 되는 것이 신기하기도 하다.

Overview

MySQL에서는 이러한 이벤트들을 Binary log 파일에 로깅할 때 로깅 포맷을 어떻게 가져갈 것인가에 대해 사용자가 선택할 수 있도록 binlog_format 이라는 설정변수(system variable)를 제공하고 있다.

  • binlog_format
    사용자는 아래 3가지 타입 중 하나를 선택하여 설정할 수 있다.
    # Possible values
    - STATEMENT : logging to be statement based
    - ROW : logging to be row based (Default value, >= 5.7.7)
    - MIXED : logging to use mixed format (Gccemacs를 (당분간) 포기했다 statement와 row image가 mix되어 로깅됨)
    (MySQL 5.7.7 이전까지는 statement-based logging format이 디폴트 값이였으며, 5.7.7 부터는 row-based logging format 이 디폴트 값으로 지정되었다.)

Row-based logging format 에서 각각의 row change event 들은 before/after 2개의 row image (row data column set) 를 포함한다.

  • Before Image : 변경되기 전 row image
  • After Image : 변경된 row image

보통 MySQL에서는 Before Image, After Image 모두 full row image (all columns) 로 로깅하나, 사실 두 이미지 모두 모든 컬럼이 로깅될 필요는 없다. 필요로하는 최소 컬럼셋만 기록하면 되는 것이다.

  • Before Image
    : row를 유니크하게 식별할 수 있는 최소한의 컬럼 셋이 필요. PK가 있다면 PK가 로깅되고 UK(all not null) 가 있다면 유니크키가 로깅됨. PK & UK (without any null columns) 둘 다 없으면 전체 컬럼들이 모두 기록됨.
  • After Image
    : 변경된 컬럼만 기록

이는 Statement-based 보다 빠르고 안전하다는 장점이 있지만 변경되는 row image가 모두 기록되다보니 대량의 delete/update 작업이 발생할 경우 디스크 용량, 네트워크 트래픽 등이 문제가 될 수 있었고 이러한 단점으로 인해 보통은 Statement-based를 사용하는 경우가 많았다.

MySQL 5.6.2 부터 binlog_row_image 라는 설정 변수가 도입되면서, Row-based logging format 일 때 row image를 최소 컬럼셋으로 로깅하게할지 full로 로깅하게할지 사용자가 선택할 수 있게 되었고 이를 통해 row-based logging format 을 사용할 때의 단점들도 보완할 수 있게 되었다.

  • binlog_row_image
    Row Before Image & After Image 에 저장될 column set을 결정하는 변수
    # Possible values
    - full: Log all columns in both the before image and the after image. (Default value)
    - minimal: Log only those columns in the before image that are required to identify the row to be changed; log only those columns in the after image that are actually changed.
    - noblob: Log all columns (same as full), except for BLOB and TEXT columns that are not required to identify rows, or that have not changed.
  • binlog_row_image 사용 시 주의 사항
    - mysql 5.5 와 그 이전 버전에서는 full image 만 사용하므로, 그보다 더 높은 버전에서 5.5 혹은 그 이전 버전을 슬레이브로 둔다면 full을 사용해야 한다.
    - minimal / noblob mode를 사용하는 환경에서 delete/update 가 제대로 동작하기 위해서는 source 및 destination table에서 아래 조건들이 충족되어야 한다.
    1) 복제되는 테이블은 src와 dest에서 컬럼이 동일하게 존재해야하고 (컬럼 순서도 동일), 컬럼 데이터 타입도 같아야 한다.
    2) 복제되는 테이블은 PK 정의가 동일해야 한다. (즉, PK가 아닌 인덱스들을 제외하고는 테이블 정의가 같아야 함.)
    이 조건들이 모두 충족되지 않는 경우, destination table 에서 실제 delete/update 에 해당되는 대상 row에 정확하게 적용되지 않을 가능성이 있으며 이 경우 warning 이나 error 메세지가 발생하지 않기 때문에 쥐도새도 모르게 마스터-슬레이브 간 데이터 정합성이 깨질 수 있다.

하지만 binlog_row_image 라는 변수가 도입되었고 또 5.7.7 에서 binlog_format의 디폴트 값이 Row-based 로 지정된 만큼, 실제로 Row-based 일 때에 문제였던 부분이 나아졌는지 확인하기 위해 테스트를 진행해보았다.

Description

테스트는 MySQL version 별로 Row-based/Statement-based 일 때 하루치 Binary Log 전체 사이즈가 얼마나 차이나는지 비교해보는 Gccemacs를 (당분간) 포기했다 방식으로 진행하였다.

우리 서비스들에서는 대량의 데이터 변경 작업이 지속적으로 진행되는 서비스가 많지 않고 대부분 OLTP성 서비스들이므로, Binary Log 양을 의도적으로 많이 쌓이게끔하여 극한의 환경에서의 사이즈/리소스 비교를 진행하진 않았음을 참고바란다.

테스트 환경 구축
1) 테스트 DB 서버들의 gtid_mode 는 모두 OFF 로 설정하였다.
2) 선정은 대부분의 데이터가 Integer Gccemacs를 (당분간) 포기했다 Type 인 것과 대부분의 데이터가 String Type 인 것 두 가지를 선정하여 서로 다른 두 환경에서의 Gccemacs를 (당분간) 포기했다 Binary Log 양을 비교한다.
3) Binary Log 사이즈에 영향을 줄만한 MySQL 설정변수들을 전부 살펴보면서 Binary Log에 최대한 불필요한 정보가 들어가지 않고 일반적으로 사용되는 셋팅으로 변수값을 설정하여 테스트를 진행한다.

위 조건들을 바탕으로 선정한 서비스 및 테스트 DB 설정 변수들은 다음과 같다.

Test1Test2
Binary Log Size일별 100G 정도 쌓일 경우일별 100~200G 정도 쌓일 경우
MySQL VersionMariaDB 5.5.24MySQL Facebook 5.6.23
Data Type대부분 Integer (int, bigint)대부분 String (char, varchar, TEXT)
Related Variablesbinlog_format
binlog_row_image (>= 5.6.2)
binlog_rows_query_log_events (>= 5.6.2)


* binlog_rows_query_log_events
5.6.2 부터 도입된 설정변수로 row-based logging format 일 때 해당 변수가 Enable 되어있으면 Binary log에 Row query log event 와 같은 정보성 로그 이벤트들이 기록된다.
Default 값은 OFF 이며, 테스트 DB들은 모두 Default 값 (즉 Disable) 그대로 설정하였다.

바이너리의 단점

네트워크 전산 프로그램

마케팅의 꽃 이라고 할 수 있는

다단계 네트워크 전산

바이너리 계보도 소개 및

각각의 특장점을 알려드릴게요!

유니레벨 계보도

네트워크 마케팅 My office 솔루션 안내

유니레벨, 바이너리 멀티레벨 마케팅 수당 계산

추천수당,후원수당 설정 및 자동 계산

소실적 수당 및 매칭 수당 20레벨까지 지정

모바일용 MY OFFICE 제공

사용자 마이오피스 조직도 챠트 제공

토큰(포인트) 연동 입출력 서비스

상품구매 쇼핑몰 연동 솔루션

센터(총판), 직급별 정산 프로그램 제공

PC + 모바일 겸용 , 앱 서비스 제공

매출의 일정비율의 금액을 주는 방식입니다.

단, 유니레벨 방식은 폭에는 제한이 없으나

얼마만큼 단계별 체계적인 그룹을 형성하느냐가 포인트입니다.

깊이 제한을 보상하기 위해서

롤업(roll up) 과 압축 (compression) 을 사용합니다.

롤업 과 압축은 활동하는 하위 자식의 판매량을

한시적으로 비활동하는 하위 레벨로 이동시켜

수당 지급의 대상에서 제외된 깊이의

레벨까지 닿도록 하는 것입니다.

유니레벨 방식은 가장 단순한 형태의 보상체계로써

대부분 처음 사업을 시작하시는 분들이

부담이 없는 유니레벨 방식으로 많이 하시며,

다만 이 한가지 방식이 아닌

유니레벨 + 바이너리 방식으로 많이들 하십니다.

2. 1레벨 하위사업자 무제한 가입가능

3. 롤업(Roll-up) 이 있어서 활동적인 리더 사업자에게 유리

4. 브레이크어웨이 장점 동일

5. 판매능력이 좋은 사업자에게 적합

2. 사업 확장성 보다는 소비자 중심

3. 롤업(Roll-up)이 있어서 비활동적인 사업자에게 불리

5. 수당레벨이 오버되면 Gccemacs를 (당분간) 포기했다 하부 라인과도 경쟁

저희가 작업했던 계보도는 회원 ID, 성명 , 실적을 알 수 있고,

여기에 추가하여 관리자가 직접 계보도 안에서

회원 추가 및 수정, 삭제까지

가능한 커스텀 모듈도 있습니다.

유니레벨 계보도 커스텀

사용자에 따라 얼마든지 커스텀이 가능한 부분이고

등록, 수정, 삭제가 데이터베이스와 연동되어

회원관리 및 매출관리를 체계적으로 가능합니다.

다음으로 바이너리 방식에 대해 알려드릴게요

바이너리 계보도


0 개 댓글

답장을 남겨주세요