workload
- 개발자
- 기록사항
2010년 어느날 ~ : 개인의 목적에 맞게 구현
2019년 3월 20일 : 공개
1.1. 개요
Filesystem 을 경유한 Random R/W access부하를 주어 성능을 측정하는 프로그램
workload는 이러한 Random 특성을 기본적인 옵션 및 설정을 통해서 부하를 발생시킵니다. (Random 특성은 실제 다양한 flow가 있을 수 있기 때문에 정량화된 측정방식은 아니라는 점)
workload는 이러한 Random 특성을 기본적인 옵션 및 설정을 통해서 부하를 발생시킵니다. (Random 특성은 실제 다양한 flow가 있을 수 있기 때문에 정량화된 측정방식은 아니라는 점)
[PNG image (21.37 KB)]
1.2. 사용권한
workload source 는 수정없이 사용하신다면 누구나 그대로 사용하셔도 좋습니다.
단, source를 수정하셔서 사용하시려고 한다면 해당 수정사항에 대한 부분을 저에게 알려주시길 바랍니다.
1.3. 사용방법
- normal 실행
# workload
- verbose mode로 실행 (기동시 자세한 초기화 과정이 표시됩니다.)
# workload -v
- background 로 실행 ( 이렇게 실행하면 상태 view는 확인할 수 없지만 좀더 높은 성능으로 부하를 줄 수 있습니다. )
# workload -d
- threads 수치 설정 (CPU Core 개수의 2배 이상을 지정하면 다소나마 부하를 높일 수 있습니다. threads를 1로 지정하)
# workload --threads 16
- 특정 시간동안만 부하를 주려면
# workload --duration <msec>
- 최대 부하를 주기위해서는 (threads는 Core의 2배수, filecount는 많을수록, filesize는 작을수록 단편화 심한 작업 => 랜덤 부하는 그 특성에 따른 parameter가 다를 필요가 있다는 것.)
# workload -v --threads 64 --filecount 1000 --filesize 4096
- workload Ramdom access 방식 조정 옵션에 대한 주요 옵션 정리.
- --threads <I/O를 일으킬 thread 개수>
- --filecount <생성/삭제/변경등의 접근을 위한 임시 파일 개수>
- --filesize <하나의 파일에 접근시 단일 I/O 크기>
- 측정 성능 수치가 높게 나오려면
- thread 수치를 Core의 2배수로 설정 (단, 16이하인 경우 16으로 설정)
- filecount 수치를 Core의 2배수로 설정
- filesize 수치를 크게 잡을수록 (Ramdom 보다는 순차적인 접근률이 높아집니다.)
- 측정 수치가 극악으로 나오게 하려면
- thread수치를 1
- filecount 를 1 또는 매우 큰값
- filesize를 1
- 순수 MySQL(None-thread, Table lock) 특성과 가장 유사한 접근을 위해서는 (유사하다고 생각되는 R/W 특성에 따른 예)
- thread 수치를 1
- filecount를 10
- filesize를 4096
- 현재 workload 기본값 (즉, 아무런 인자 없이 실행하는 경우)
- threads 16
- filecount 1000
- filesize 4096
- 추가적인 특성을 부여하기 위한 옵션
- -v : 초기 구동시 구동내용을 표시하고 syslog 로 관련 내용을 기록
- -d : view를 표시하지 않고 daemonize 로 실행 (순수 I/O를 일으키고 상태를 모니터링하지 않고자 할 때 사용)
- --left <value> --right <value> : 임시파일들을 균등하게 접근하지 않고 비율로 접근하는 값 (기본값은 7:1)
- --interval <msec> : I/O 접근 간격 강제 조정
- --duration <msec> : 측정 시간 (이 시간이 지나면 workload는 자동 종료)
- --assign-method <random|ordered|even> : 임시 파일을 disk경로 단위로 분산하는 알고리즘 선택 (기본값: even)
- --relocate : 임시 파일을 비율에 따라서 재배치(파일 move) 병행
- 그 밖에 본래 구현은 있으나 빌드시 기본적으로 포함되지 않은 기능
- sqlite3 또는 Mysql 또는 MS-SQL 로 workload 실행 결과를 리포팅(push) 생성하는 기능 (이를 통해서 리포팅된 DB를 기반으로 분석하기 위한 기능)
- 중간중간에 리포팅을 모니터링하는 기능인 --dump-disk, --dump-file 옵션이 여기에 관여함.
- sqlite3 또는 Mysql 또는 MS-SQL 로 workload 실행 결과를 리포팅(push) 생성하는 기능 (이를 통해서 리포팅된 DB를 기반으로 분석하기 위한 기능)
1.4. 다운로드
- 소스
- 최신 소스 다운로드 : https://github.com/minzkn/workload
- workload-source-20190320.tar.gz (75.96 KB)
- https://www.minzkn.com/public/release/workload/
- 설정파일 예시 ("/etc/workload.xml"로 저장하고 적절히 수정하여 사용. 설정파일이 없는 경우 내장된 기본 설정으로 동작.)
- https://www.minzkn.com/public/release/workload/workload.xml
<?xml version="1.0" encoding="UTF-8"?> <workload> <config> <!-- type=sqlite3|mysql --> <meta type="none"> <!-- SQLite3 (too slow !!!) --> <pathname>./workload.db</pathname> <!-- MySQL --> <hostname>127.0.0.1</hostname> <port>0</port> <username>workload</username> <password>workload</password> <database>workload</database> </meta> <operation pause="no"> <left>7</left> <right>1</right> <interval>0</interval> <!-- maximum 1000000, assign=random|ordered|even --> <files remove="yes" assign="even">1000</files> <prefix>workload</prefix> <suffix>.bin</suffix> <filesize>4096</filesize> <duration>0</duration> <!-- (r)ead, (w)rite, rw --> <access sync="yes" sendfile="yes" threads="16">rw</access> </operation> <storage> <disk> <!-- <name>volume1</name> --> <path create="yes">./test/disk1</path> </disk> <disk> <path create="yes">./test/disk2</path> </disk> <disk> <path create="yes">./test/disk3</path> </disk> <disk> <path create="yes">./test/disk4</path> </disk> <disk> <path create="yes">./test/disk5</path> </disk> <disk> <path create="yes">./test/disk6</path> </disk> <disk> <path create="yes">./test/disk7</path> </disk> <disk> <path create="yes">./test/disk8</path> </disk> <disk> <path create="yes">./test/disk9</path> </disk> <disk> <path create="yes">./test/disk10</path> </disk> <disk> <path create="yes">./test/disk11</path> </disk> <disk> <path create="yes">./test/disk12</path> </disk> <disk> <path create="yes">./test/disk13</path> </disk> <disk> <path create="yes">./test/disk14</path> </disk> <disk> <path create="yes">./test/disk15</path> </disk> <disk> <path create="yes">./test/disk16</path> </disk> </storage> </config> </workload> <!-- vim: set expandtab: --> <!-- End of config -->
- https://www.minzkn.com/public/release/workload/workload.xml
1.5. 참고자료
- dd 명령은 Sequential 한 Write 성능을 측정
dd if=/dev/zero of=<device 또는 파일> bs=<block size> count=<count> conv=fsync
- iotop 명령은 각 프로세스별 R/W 속도와 총합에 대한 속도를 실시간 정보로 표시
- Generic Netlink protocol을 이용한 TASKSTATS정보로 계산
- "/proc/<pid>/io" 정보를 활용하는 방법도 있으나 iotop은 Netlink 로 구현됨.
- netlink_iotop 예제소스(하기 링크) 현재 실행되고 있는 각 프로세스별 R/W 총량을 정보로 표시. 즉, process 중에서 어떤게 제일 많은 I/O를 일으켰는가를 실시간이 아닌 누적 총량으로 확인
- hdparm/sdparm/smartctl 명령등은 Filesystem 과 상관없는 access 성능 측정 (즉, Disk I/O는 어느정도 의미 있으나 Filesystem을 고려하지 않음)
- Filesystem의 성능에 크게 영향을 주는 사항
- mount option
- nobarrier vs barrier
- noatime vs relatime
- jounal 유무
- Disk 탐색(seek) 응답 시간
- mount option