workload

대문 / 공개프로젝트 / workload

workload

  • 개발자
    조재혁(Mminzkn@minzkn.com)

  • 기록사항
    2010년 어느날 ~ : 개인의 목적에 맞게 구현
    2019년 3월 20일 : 공개


1.1. 개요

Filesystem 을 경유한 Random R/W access부하를 주어 성능을 측정하는 프로그램

workload는 이러한 Random 특성을 기본적인 옵션 및 설정을 통해서 부하를 발생시킵니다. (Random 특성은 실제 다양한 flow가 있을 수 있기 때문에 정량화된 측정방식은 아니라는 점)

workload_1.png
[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 크기>
  • 측정 성능 수치가 높게 나오려면
    1. thread 수치를 Core의 2배수로 설정 (단, 16이하인 경우 16으로 설정)
    2. filecount 수치를 Core의 2배수로 설정
    3. filesize 수치를 크게 잡을수록 (Ramdom 보다는 순차적인 접근률이 높아집니다.)
  • 측정 수치가 극악으로 나오게 하려면
    1. thread수치를 1
    2. filecount 를 1 또는 매우 큰값
    3. filesize를 1
  • 순수 MySQL(None-thread, Table lock) 특성과 가장 유사한 접근을 위해서는 (유사하다고 생각되는 R/W 특성에 따른 예)
    1. thread 수치를 1
    2. filecount를 10
    3. filesize를 4096
  • 현재 workload 기본값 (즉, 아무런 인자 없이 실행하는 경우)
    1. threads 16
    2. filecount 1000
    3. 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 옵션이 여기에 관여함.

1.4. 다운로드

  • 소스
    • 최신 소스 다운로드 : [https]https://github.com/minzkn/workload[]
    • @workload-source-20190320.tar.gz (75.96 KB)
    • [https]https://www.minzkn.com/public/release/workload/[]
    • 설정파일 예시 ("/etc/workload.xml"로 저장하고 적절히 수정하여 사용. 설정파일이 없는 경우 내장된 기본 설정으로 동작.)
      • [https]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 -->
        

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) 응답 시간
Retrieved from https://www.minzkn.com:443/moniwiki/wiki.php/workload
last modified 2024-05-17 23:26:16