본문 바로가기
Performance

MessagePack, ProtoBuf 성능 비교

by 장쿨이 2020. 9. 16.

Hamonica 에서 데이터 전송 규약으로 사용할 라이브러리를 선택하기 위해 성능 비교를 한다.

 

항목

JDK OpenJDK 11
Message Pack 0.8.21
ProtoBuf 3.13.0


시스템

CPU Inter(R) Core(TM) i7-9700 CPU @ 3.00GHz 3.00Ghz
Memory 32.0 GB
OS Window 10


1. Message Pack


  • 네트워크 통신 데이터 직렬화 라이브러리.
  • 여러 언어에서 사용할 수 있도록 언어별(50여가지) 라이브러리를 지원함.
  • 웬만한 JDK에서는 동작하나 IBM JDK는 지원하지 않음.
  • Java 라이브러리를 이용하여 바로 사용 가능.(별도의 파일로 작성하여 compile 하는 것 불 필요)
  • 필요한 만큼 사용자가 직접 byte에 기록하기에 불필요한 metadata가 붙지 않아서 byte사이즈 감소, 처리 속도 빠름.(단. 처리 건수가 몇십만건 이상 많아질 수록 처리가 느려짐, GC처리 횟수 빈번)
  • 최대한 편하게 사용하도록 커스터마이징 한다 하여도 개발시 바이트를 제대로 읽고, 쓰기 위해 수 작업이 필요 함 

    Public class Sample {

     

        private byte dataType;

        private String name;

     

        public void parse(byte[] bytes) {

            MessageUnpacker unPacker = MessagePack.newDefaultUnpacker(bytes);

            this.dataType            = unPacker.unpackByte();

            this.name                = unPacker.unpackString();

        }

    }

  • 전송 데이터를 byte로 각각 처리하는것 이외에 JSON형식의 데이터를 최적화 

 

 

 

2. Protocol Buffer(Protobuf)


  • 구글에서 제공 하는 네트워크 통신 데이터 직렬화 라이브러리이다.
  • Message Pack과 마찬가지로 여러 언어에서 사용할 수 있도록 지원함.
  • .proto 파일을 compilie하는 단계가 필요.
    • .proto 파일을 compile 한 뒤 생성된 자바 클래스는 set, get 메소드를 이용하여 데이터를 읽고 쓰기만 하면 되기 때문에 별도의 작업의 필요 없음.
  • byte데이터를 객체로 변환 시 parse메소드를 호출하면 값이 자동으로 설정 됨.

    TransactionPackBuilder.TransactionPack builder = TransactionPackBuilder.TransactionPack.parseFrom(packet.content().nioBuffer());

  • 속도는 빠른편이나 metadata가 붙게되어 MessagePack 보다는 데이터 처리량이 많아 짐. 대략 messagePack 기준 1/3 정도 더 데이터 증가. (단. 처리 건수가 몇만건 이상 많아질 수록 처리가 안정적으로 빠름, GC처리 횟수 안정적)

 

3. 성능 비교.


  • Message Pack, Protobuf 성능 비교 실시.
  • 단일 쓰레드에서 처리 속도 및 바이트 처리량 검증.
  • 단일 쓰레드에서 데이터 객체 직렬화 후 네트워크(netty) 전송 처리시 CPU, Heap 처리량 검증.

3.1 단일 쓰레드에서 처리 속도 및 바이트 처리량 비교.


- 1만건 처리

횟수

Message Pack Protocol Buffer
처리시간(ms) 처리량(byte) 처리시간(ms) 처리량(byte)
1회 55 1040000 73 1450000
2회 51 70
3회 57 73
4회 57 75
5회 55 73
평균 55   72.8  


- 2만건 처리

횟수

Message Pack Protocol Buffer
처리시간(ms) 처리량(byte) 처리시간(ms) 처리량(byte)
1회 86 2080000 89 2900000
2회 88 88
3회 84 87
4회 82 92
5회 82 88
평균 84.4   88.8  

 

- 5만건 처리

횟수

Message Pack Protocol Buffer
처리시간(ms) 처리량(byte) 처리시간(ms) 처리량(byte)
1회 146 5200000 128 7250000
2회 146 128
3회 145 133
4회 144 127
5회 152 131
평균 146.6   129.4  

 

- 10만건 처리

횟수

Message Pack Protocol Buffer
처리시간(ms) 처리량(byte) 처리시간(ms) 처리량(byte)
1회 190 5200000 165 7250000
2회 187 167
3회 190 162
4회 184 170
5회 183 168
평균 186.8   166.4  

 

 

 

3.2 데이터 직렬화 후 네트워크 전송 처리 비교


  • 1초를 0.5초 기준으로 나누어서 초당 1만건, 2만건, 10만건 기준으로 비교. 
    • 1만건일 경우 0.5초당 5,000건 처리.
    • 2만건일 경우 0.5초당 10,000건 처리.
    • 10만건일 경우 0.5초당 50,000건 처리.
  • -xms, -xmx 옵션 미적용 하거나 Heap 크기 지정 후 비교.
  • 테스트 시간은 10분, 20분 기준으로 측정.

 

3.2.1 1초 기준 10,000 건 비교

- Message Pack - 초당 1만건 10분 기준

- Message Pack- 초당 1만건 20분 기준, Heap Size 1G 지정.


- ProtoBuf - 초당 1만건 10분 기준

- ProtoBuf - 초당 1만건 20분 기준, Heap Size 1G 지정.

 

3.2.2 1초 기준 20,000 건 비교


- Message Pack - 초당 2만건 10분 기준

 

- Message Pack- 초당 2만건 20분 기준, Heap Size 1G 지정.

 


- ProtoBuf - 초당 2만건 10분 기준

- ProtoBuf - 초당 2만건 20분 기준, Heap Size 1G 지정.


 

3.2.3 1초 기준 100,000 건 비교


- Message Pack - 초당 10만건 10분 기준

 

- Message Pack- 초당 10만건 20분 기준, Heap Size 1G 지정.


 


- ProtoBuf - 초당 10만건 10분 기준

 

 

- ProtoBuf - 초당 10만건 20분 기준, Heap Size 1G 지정.

 

4. 결론.


  • 데이터 직렬화 처리가 많아 질수록 처리속도는 ProtocolBuffer 우세, 처리속도가 적을 수록 MessagePack 우세.
  • 데이터 직렬화 byte크기는 MessagePack 우세, ProtocolBuffer 구조상 metadata가 더 붙기 때문에 MessagePack 보다 전송 바이트가 더 큼.
  • 데이터 직렬화 후 데이터 전송 시  CPU 상에서는 큰 차이를 확인할 수 없슴.
  • Heap 메모리 관리에서 Protocol Buffer가 좀더 나은 성능을 보여줌.
    - 2만건 이하, 또는 10만건 이상 처리시 Heap메모리 처리는 Protocol Buffer가 좀더 나은 성능을 보여줌.
    - 처리할 데이터가 많아 질수록 Message Pack은 빈번한 GC처리로 인하여 CPU 처리량에 영향을 주어 Protocol Buffer보다 불안한 상태를 보여줌.
  • Heap Size는 고정값을 지정해 주길 권장하며 무한정 늘어나게 할 경우 OOME 발생 가능성 높음.(OOME가 발생한 상황은 테스트 기기가 처리할 수 있는 한계치를 넘어서 발생, 일반적인 수준의 데이터 전송은 이상 없음.) 

 

단순 성능을 비교시 큰 차이가 없었으나 시간이 흐르고 데이터 처리가 많아 질수록 Protocol Buffer가 메모리 관리가 좋은 것을 확인 함.
또한 개발 편의성 및 라이브러리 자료 탐색에서도 ProtocolBuffer가 우수함.
직렬화 바이트 크기가 고민거리였으나 기존 처럼 디스크에 File로 남기는 데이터를 Postgresql 또는 시계열 DB를 이용하여 처리 하기로 하여 고민에서 제외함.
또한 실제 운영 WAS처럼 바쁜 환경에서 처리되야 하기 때문에 메모리 관리를 우선 순위로 삼았으며 Protocol Buffer를 선택 하게 됨.

 

댓글