1. 개요
팀 프로젝트를 진행하며 동시성 문제를 해결하기 위해 다양한 방법들을 사용해 보았으며
이 방법들을 모두 포함한 프로젝트를 AWS를 이용한 서버에 올려서 구동하였다.
서버에서 동시성 부하 테스트를 진행하며 성능을 측정해보았다.
2. 테스트 환경
메인서버 : t2.micro(??)
트래픽(카프카) 서버 : t2.micro(??)
카프카서버 : t3.small(??)
RDS서버 : t2.micro(??) MySQL
테스트는 카프카,뮤텍스,세마포어,비관적락, Transactional Serializable 5가지로 진행하였으며
각각 0.1초동안 100개 쓰레드에서 같은 요청을 보내는 테스트를 10번 진행하였다.
초기 테스트 수행시 속도가 느리게 측정되는 현상이 있어 10번 중 앞의 4개 시행은 버리고 6개 시행을 기록하였고
6개 시행의 평균값들의 평균을 작성하였다.
3. 테스트 결과
구분 | bookDonation 평균값 | 시행 | 표본수 | 평균 | 중간값 | 90% | 95% | 99% | 최소값 | 최대값 | 오류 |
1. 카프카 | 749.2 | 1 | 100 | 780 | 767 | 1020 | 1043 | 1072 | 485 | 1080 | 0 |
2 | 100 | 737 | 734 | 987 | 1011 | 1042 | 416 | 1047 | 0 | ||
3 | 100 | 744 | 744 | 965 | 995 | 1016 | 472 | 1021 | 0 | ||
4 | 100 | 725 | 729 | 955 | 977 | 998 | 417 | 1007 | 0 | ||
5 | 100 | 763 | 765 | 978 | 1010 | 1028 | 471 | 1034 | 0 | ||
6 | 100 | 746 | 748 | 960 | 985 | 1007 | 335 | 1012 | 0 | ||
2. 뮤텍스 | 563.2 | 1 | 100 | 568 | 569 | 796 | 836 | 848 | 251 | 851 | 0 |
2 | 100 | 630 | 652 | 900 | 923 | 948 | 264 | 953 | 0 | ||
3 | 100 | 555 | 552 | 771 | 795 | 829 | 287 | 830 | 0 | ||
4 | 100 | 538 | 531 | 767 | 791 | 816 | 257 | 825 | 0 | ||
5 | 100 | 536 | 536 | 748 | 780 | 805 | 257 | 810 | 0 | ||
6 | 100 | 552 | 555 | 784 | 806 | 836 | 256 | 837 | 0 | ||
3. 세마포어 | 613.2 | 1 | 100 | 791 | 789 | 1014 | 1041 | 1061 | 513 | 1070 | 0 |
2 | 100 | 535 | 531 | 749 | 779 | 796 | 277 | 802 | 0 | ||
3 | 100 | 542 | 539 | 763 | 782 | 806 | 278 | 813 | 0 | ||
4 | 100 | 632 | 627 | 877 | 910 | 940 | 346 | 945 | 0 | ||
5 | 100 | 579 | 575 | 809 | 840 | 865 | 277 | 876 | 0 | ||
6 | 100 | 600 | 592 | 813 | 851 | 874 | 331 | 876 | 0 | ||
4. 비관적락 | 412.2 | 1 | 100 | 442 | 438 | 565 | 574 | 581 | 301 | 584 | 0 |
2 | 100 | 428 | 425 | 549 | 566 | 571 | 281 | 572 | 0 | ||
3 | 100 | 422 | 428 | 536 | 546 | 550 | 261 | 551 | 0 | ||
4 | 100 | 383 | 381 | 495 | 507 | 512 | 248 | 512 | 0 | ||
5 | 100 | 386 | 388 | 489 | 496 | 499 | 248 | 505 | 0 | ||
6 | 100 | 394 | 390 | 498 | 504 | 511 | 268 | 512 | 0 | ||
5. Transactional Serializable | 451.8 | 1 | 100 | 482 | 473 | 570 | 631 | 644 | 362 | 648 | 0.09 |
2 | 100 | 470 | 465 | 557 | 593 | 621 | 352 | 625 | 0.11 | ||
3 | 100 | 440 | 425 | 550 | 571 | 578 | 320 | 587 | 0.13 | ||
4 | 100 | 422 | 418 | 494 | 545 | 562 | 310 | 567 | 0.1 | ||
5 | 100 | 456 | 434 | 512 | 556 | 601 | 323 | 603 | 0.1 | ||
6 | 100 | 441 | 466 | 536 | 589 | 597 | 340 | 611 | 0.12 |
구분 | 평균값(ms) |
1. 카프카 | 749.2 |
2. 뮤텍스 | 563.2 |
3. 세마포어 | 613.2 |
4. 비관적락 | 412.2 |
5. Transactional Serializable | 451.8 |
비관적락, Serializable, 뮤텍스, 세마포어, 카프카 순으로 속도가 빨랐다. 서버가 대부분 t2.micro다 보니 성능이 떨어져서 로컬에선 0.1~0.4초의 시간이 나오는 것이 0.4~0.7초 정도로 증가하였다.
속도가 가장 느려서 찝찝하긴 한데 일단 프로젝트에는 카프카를 적용하고자 한다.
이유는 카프카를 사용시 동시성 제어 뿐만 아니라 서버를 producer와 consumer로 나누어 서버 부하를 줄이고 확장에 용이하게 만들기 때문이다.
테스트 결과가 포함된 엑셀 파일을 아래 첨부한다.