• HLS 스트리밍은 적응형 비트 스트리밍(Adaptive bitrate streaming) 기술
  • 비디오가 HLS로 인코딩되면 여러 대역폭 및 해상도로 여러 파일이 만들어짐
  • 파일은 mpg2_ts 코덱을 사용하여 인코딩
  • 스트림은 화면 크기와 사용 가능한 대역폭에 따라 M3u8 색인 파일을 사용하여 실시간으로 클라이언트에 매핑


M3U8 파일을 열고, 편집하고, 변환하는 방법

  • M3U8 파일 확장명을 가진 파일은 UTF-8 인코딩 오디오 재생 목록 파일
  • 미디어 파일의 위치를 설명하기 위해 오디오 및 비디오 플레이어에서 모두 사용할 수 있는 일반 텍스트 파일 → 하나의 M3U8 파일은 인터넷 라디오 방송국의 온라인 파일에 대한 참조를 제공 가능
  • 컴퓨터에 다른 음악 파일을 만들어 자신만의 음악이나 일련의 비디오를 재생 목록 생성 가능
  • M3U8 파일은 절대 경로, 상대 경로 및 URL을 사용하여 특정 미디어 파일 및 / 또는 미디어 파일의 전체 폴더를 참조 가능
  • 주석으로 M3U8 파일의 다른 텍스트 정보를 표시 가능
  • M3U8 파일과 유사한 M3U도 UTF-8 문자 인코딩을 사용할 수 있지만 다른 문자 인코딩도 포함 가능
  • .M3U8 파일 확장명은 파일이 실제로 UTF-8 문자 인코딩을 사용하고 있음을 나타냄


M3U8 파일을 여는 방법

  • M3U8 파일은 Windows의 메모장을 포함한 대부분의 텍스트 편집기에서 편집하고 읽을 수 있음
  • 메모장에서이 M3U8 파일을 열면 파일 참조만 읽을 수 있음
  • 텍스트 편집기가 미디어 플레이어 또는 미디어 관리 소프트웨어 프로그램과 동일하지 않기 때문에 음악 파일을 실제로 재생 불가능

1. 메모장에 M3U8 파일 내용

  • VLC, Apple의 iTunes, Windows Media Player 및 Songbird는 M3U8 파일을 열고 사용할 수있는 프로그램의 몇 가지 예
  • Linux에서 M3U8 파일을 여는 방법은 XMMS

2. VLC에서 Open한 M3U8 파일

VLC로 열면 텍스트 파일에서 참조 된 모든 음악 파일을 수집하여 재생을 위해 미디어 플레이어에 로드



3. 온라인에서 Open한 M3U8 파일

  • M3U8 파일을 온라인으로 열 수있는 빠른 방법은 HSLPlayer.net을 이용
  • 컴퓨터나 다른 장치에 M3U8 파일이 저장된 경우 웹 사이트는 작동 X
  • M3U8 파일에 대한 URL이 있고 참조하는 파일이 온라인 상태인 경우에만 HSLPlayer.net을 사용 가능
  • HSLPlayer.net을 이용하면 M3U8 파일 생성 가능 → VLC에 많은 파일을로드하는 경우 미디어> 파일에 재생 목록 저장 (옵션을 사용하여 M3U8 파일을 생성 가능)


M3U8 파일을 변환하는 방법

  • M3U8을 MP4나 MP3 또는 다른 미디어 형식으로 변환하려면 M3U8 파일이 일반 텍스트 파일이라는 것을 이해 필요 → M3U8 파일은 재생할 수있는 텍스트는 포함 X
  • M3U8이 언급하는 오디오 또는 비디오 파일을 MP4 to AVI 변환기 나 WAV to MP3 변환기와 같은 다른 오디오 / 비디오 파일 형식으로 변환하거나 변환 할 수있는 파일 변환기가 필요


'IT 학습 용어' 카테고리의 다른 글

CI/CD 설명  (0) 2022.07.07
file storage, block storage, object storage이란  (0) 2022.07.03
페이로드(payload)  (0) 2022.06.27
LRU (Least Recently Used)  (0) 2022.06.27
Consistent Hashing 정리  (0) 2022.06.24
  • 운영체제의 페이지 교체 알고리즘 중 하나
  • 페이지를 교체할 때 가장 오랫동안 사용되지 않은 페이지를 교체 대상으로 삼는 기법

 

LRU Cache

  • LRU Cache는 캐시에 공간이 부족할 때 가장 오랫동안 사용하지 않은 항목을 제거하고 새로운 녀석을 배치하는 형식으로 동작
  • LRU Cache의 사용 관점 → '오랫동안 사용되지 않은 항목은 앞으로도 사용되지 않을 가능성이 높기에, 가장 오랫동안 참조되지 않은 녀석을 캐시에서 제거하자'
  • LRU Cache를 통해 캐시 메모리의 히트율을 높이는 것은 입증됐으며, 현재 가장 많이 사용되는 알고리즘 중 하나임

 

구현 방식

  • LRU Cache 의 구현은 Double Linked List를 이용
  • Head에 가까운 데이터일수록 최근에 사용된 데이터
  • Tail에 가까울 수록 오랫동안 사용되지 않은 데이터로 간주
  • 새로운 데이터를 삽입할 때, Tail 값을 가장 먼저 삭제시키고 Head에 데이터를 삽입
  • 캐시에 적재된 어떤 데이터를 사용한 경우, 해당 데이터를 Head로 옮겨 가장 최근에 사용된 값임을 표시 → 삭제 우선순위에서 멀어짐
  • 캐시 교체 시간 복잡도 → O(1)

 

LRU Cache 순서 방식 도식화

 

참고 자료

'IT 학습 용어' 카테고리의 다른 글

CI/CD 설명  (0) 2022.07.07
file storage, block storage, object storage이란  (0) 2022.07.03
페이로드(payload)  (0) 2022.06.27
M3U8 파일  (0) 2022.06.27
Consistent Hashing 정리  (0) 2022.06.24

1. 현재 사용중인 커널 버전 확인

$ uname -r

2. 설치 가능한 커널 패키지 확인

$ yum list kernel --shwduplicates

3. 원하는 커널 패키지 업그레이드

  • 가장 최신 커널 패키지 설치가 아닌 경우에 사용
  • 만약 최신 커널 패키지 업그레이드를 원하는 경우에는 yum update -y kernel을 하면 됨
    $ yum install kernel-3.10.0-1160.36.2.el7

4. 현재 설정된 부팅 1순위 확인

$ grub2-editenv list

5. 업데이트된 커널로 부팅할 수 있도록 설정

  • 현재 설정된 부팅 1순위 커널이 부팅될 수 있도록 설정
    $ grub2-set-default 0
    $ grub2-editenv list

6. 업데이트된 커널로 재부팅

$ reboot

7. 업그레이드한 커널으로 부팅되었는지 확인

$ uname -r

8. GRUB Menu에서 Kernel Entry가 어떻게 나올지 확인 (부팅 우선순위 확인)

$ cat /etc/grub2.cfg | grep "menuentry " | awk -F"'" '{print $2}'
CentOS Linux (3.10.0-1160.36.2.el7.x86_64) 7 (Core)                    # Entry 0
CentOS Linux (3.10.0-1160.25.1.el7.x86_64) 7 (Core)                    # Entry 1
CentOS Linux (0-rescue-47e970e504d7415d8539a0173fc7a670) 7 (Core)      # Entry 2

9. 부팅 1순위 변경

  • 커널 업그레이드 이전 버전의 커널로 부팅할 수 있게 변경
    $ grub2-set-default 1
    $ grub2-editenv list

10. 업데이트된 커널로 재부팅

$ reboot

11. 업그레이드한 커널으로 부팅되었는지 확인

$ uname -r

  • openssl 버전이 낮아서 인증서 검증에 실패하거나 보안 이슈가 발생할 수 있기에 업그레이드 필요

1. 기존 Openssl 삭제

  • 아래의 명령어를 입력하여 기존 Openssl를 삭제
    $ yum remove openssl -y
    Loaded plugins: fastestmirror
    Resolving Dependencies
    ...중략...
    Complete!

2. Openssl 1.1.1o 다운로드

  • 아래의 명령어를 입력하여 Openssl 1.1.1o를 다운로드

    $ wget --no-check-certificate https://www.openssl.org/source/openssl-1.1.1o.tar.gz
    --2022-06-28 10:24:33--  https://www.openssl.org/source/openssl-1.1.1o.tar.gz
    Resolving www.openssl.org (www.openssl.org)... 23.65.57.54, 2600:1410:2000:19a::c1e, 2600:1410:2000:19c::c1e
    Connecting to www.openssl.org (www.openssl.org)|23.65.57.54|:443... connected.
    WARNING: cannot verify www.openssl.org's certificate, issued by ‘/C=US/O=Let's Encrypt/CN=R3’:
    Issued certificate has expired.
    HTTP request sent, awaiting response... 200 OK
    Length: 9856386 (9.4M) [application/x-gzip]
    Saving to: ‘openssl-1.1.1o.tar.gz’
    ...중략...
    2022-06-28 10:24:36 (97.8 MB/s) - ‘openssl-1.1.1o.tar.gz’ saved [9856386/9856386]
    
    $ ls -al openssl-1.1.1o.tar.gz
    -rw-r--r--. 1 root root 9856386 May  3 23:02 openssl-1.1.1o.tar.gz

3. Openssl 1.1.1o 압축해제

  • 아래의 명령어를 입력하여 다운받은 Openssl 1.1.1o를 압축 해제

    $ tar -xvfz openssl-1.1.1o.tar.gz

4. Openssl 1.1.1o 폴더로 이동 및 설정

  • 아래의 명령어처럼 입력

    $ cd openssl-1.1.1o
    $ ./config shared zlib
    Configuring OpenSSL version 1.1.1o (0x101010ffL) for linux-x86_64
    Using os-specific seed configuration
    Creating configdata.pm
    Creating Makefile

5. Openssl 1.1.1o 설치

  • 아래의 명령어를 입력하여 Openssl 1.1.1o를 설치

  • 설치에 필요한 패키지 설치

    $ yum install gcc gcc-c++ pcre-devel zlib-devel perl wget -y
  • Openssl 1.1.1o를 컴파일

    $ make && make install

6. Openssl 1.1.1o 정상 동작 확인

  • 아래의 명령어를 입력하여 /usr/local/bin/openssl 경로에 설치한 Openssl 1.1.1o가 정상동작하는지 확인 가능

    $ cp /usr/local/bin/openssl /usr/bin/openssl
    
    $ /usr/local/bin/openssl version
    /bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
  • openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory 에러 발생
    $ cp /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
  • openssl: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory 에러 발생
    $ cp /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
  • 에러 해결 후 openssl 버전 재확인
    $ openssl version
    OpenSSL 1.1.1o  3 May 2022

7. Openssl 1.1.1o 설치 정보 등록

  • 아래의 명령어를 입력하여 Openssl 1.1.1o 설치 정보를 등록하여 다른 프로그램이 1.1.1o를 참조하도록 설정
  • 라이브러리 등록

    $ echo "/usr/local/lib64/" >> /etc/ld.so.conf
    $ ldconfig -v
    ldconfig: Path `/opt/dell/srvadmin/lib64' given more than once
    ldconfig: Path `/opt/dell/srvadmin/lib64' given more than once
    ldconfig: Path `/opt/dell/srvadmin/lib64' given more than once
    ldconfig: Path `/opt/dell/srvadmin/lib64' given more than once
    ...생략...
  • Openssl 1.1.1o 환경변수를 작성 → 테스트 필요

    $ cat > /etc/profile.d/openssl.sh << EOF
    export OPENSSL_PATH="/usr/local/bin/openssl"
    export OPENSSL_ROOT_DIR="/usr/local/ssl"
    export OPENSSL_LIBRARIES="/usr/local/lib/"
    export OPENSSL_INCLUDE_DIR="/usr/local/include/openssl/"
    PATH=$PATH:$OPENSSL_PATH
    EOF
  • openssl 1.1.1o 환경변수가 잘 등록되었는지 확인 → 테스트 필요

    $ cat /etc/profile.d/openssl.sh
    export OPENSSL_PATH="/usr/local/bin/openssl"
    export OPENSSL_ROOT_DIR="/usr/local/ssl"
    export OPENSSL_LIBRARIES="/usr/local/lib/"
    export OPENSSL_INCLUDE_DIR="/usr/local/include/openssl/"
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:
  • 환경변수 파일의 실행 권한을 수정

    $ chmod 755 /etc/profile.d/openssl.sh

※ 참고

  • hdparm 명령어는 시스템에 장착된 하드디스크의 속도와 성능을 테스트할 수 있음 → 실무에서 IDE 또는 SCSI 하드디스크의 ACCESS 속도를 측정할 때에 많이 사용
  • hdparm 명령어로 하드디스크의 직접적인 성능에 영향을 줄 수 있는 여러가지 설정이 가능하지만, 극히 위험한 상황을 초래할 수 있으므로 설정의 용도로는 사용하지 않는 것이 좋음
  • hdparm 명령어로 점검하는 하드디스크의 속도는 절대적인 것이 아님 → 동일한 시스템에서 동일한 환경으로 테스트한 결과값도 조금 다르게 나올 수 있음
  • CPU와 메모리, 그리고 시스템 사양에 따라서 hdparm 테스트 결과가 매우 다르게 나올 수 있음 → 대략적인 하드디스크의 읽는 속도를 확인하기 위하여 hdparm 명령어은 매우 유용

hdparm 명령어 설치

$ yum install -y hdparm

명령어위치

$ which hdparm
/sbin/hdparm

하드디스크를 구입 기준

  1. IDE하드디스크인가? 아니면 SCSI하드디스크인가?
  2. 하드디스크의 RPM(디스크의 분당 회전수)은 얼마인가?
  3. 하드디스크의 용량은 얼마인가?
  4. 어느회사에서 생산한 제품인가?
  5. 하드디스크의 안정성은 확보되어있는가?
  6. 하드디스크의 외관


hdparm 명령어 옵션

hdparm 명령어 주로 사용하는 옵션

  • -t : 버퍼되어 있지 않은 데이터를 읽는 속도 체크
  • -T : 버퍼된 데이터를 읽는 속도를 체크


hdparm 명령어로 버퍼링되지 않은 데이터의 디스크 ACCESS 속도 체크하기

  • 시스템에 장착되어 있는 SCSI하드디스크의 속도를 체크
  • -t 옵션을 사용한 것은 버퍼링(buffering)이 전혀 되어있지 않은 데이터를 실제로 디스크에서 얼마나 빠르게 읽을 수 있는가를 확인
  • hdparm명령어는 실제로 2~3회의 테스트를 실시한 후에 출력
  • SCSI 하드디스크가 IDE 하드디스크보다는 데이터의 읽은 속도에 있어서 현저하게 성능이 높음

1.SCSI 하드디스크 테스트 결과

  • 시스템에 장착되어 있는 SCSI 하드디스크의 경우 실제로 디스크에 존재하는 데이터를 읽는 속도가 초당 약64MB

    $ hdparm -t /dev/sda
    
    /dev/sda:
    Timing buffered disk reads:  64 MB in  0.99 seconds = 64.65 MB/sec

2.IDE 하드디스크 테스트 결과

  • 시스템에 장착되어 있는 IDE 디스크의 경우 실제로 디스크에 존재하는 데이터를 읽는 속도가 초당 약26MB

    $ hdparm -t /dev/hda
    
    /dev/hda:
    Timing buffered disk reads:  64 MB in  2.42 seconds = 26.45 MB/sec



hdparm 명령어로 버퍼링 유무 데이터 ACCESS 속도 비교하기

  • 캐쉬(cache)에 버퍼링되어 있는 데이터를 읽는다면 실제 속도는 엄청나게 빨라짐
  • 캐쉬(cache)에 저장된 데이터를 읽는다는 것은 실제로 디스크에서 읽어오는 것이 아니라 캐쉬메모리(cache)에서 읽어오는 것이기 때문임
  • 위에서 설명한 -t 옵션은 디스크에 존재하는 데이터를 읽는 속도를 테스트하는 것이라면, -T 옵션은 캐쉬에 존재하는 데이터를 읽는 속도를 테스트

1. SCSI 디스크의 캐쉬에 버퍼링되어 있는 데이터와 실제 디스크에서 데이터의 읽는 속도 비교

  • 캐쉬메모리가 시스템의 속도에 막대한 영향을 미침을 확인 가능
    1. 캐쉬에 버퍼링되어 있는 데이터(T옵션)를 읽을 때에는 초당 약 220MB
    2. 실제로 디스크에서 데이터(t옵션)를 읽어오는 속도는 초당 약 65MB
      $ hdparm -tT /dev/sda  
      /dev/sda:
      Timing buffer-cache reads:   128 MB in  0.58 seconds =220.69 MB/sec
      Timing buffered disk reads:  64 MB in  0.97 seconds = 65.98 MB/sec

2. IDE 디스크의 캐쉬에 버퍼링되어 있는 데이터와 실제 디스크의 읽는 속도 비교

  • 캐쉬메모리가 시스템의 속도에 막대한 영향을 미침을 확인 가능
    1. 캐쉬에 버퍼링되어 있는 데이터(T옵션)를 읽을 때에는 초당 약 216MB
    2. 실제로 디스크에서 데이터(t옵션)를 읽어오는 속도는 초당 약 25MB
      $ hdparm -tT /dev/hda
      /dev/hda:
      Timing buffer-cache reads:   128 MB in  0.59 seconds =216.95 MB/sec
      Timing buffered disk reads:  64 MB in  2.48 seconds = 25.81 MB/sec


SSD가 Trim 기능 지원여부 확인 → Trim 사용하면 /etc/fstab에 discard를 추가

1. hdparm 명령어에 -I 옵션을 통해 SSD의 Trim 기능 확인

$ hdparm -I /dev/sda

/dev/sda:

ATA device, with non-removable media
        Model Number:       DELLBOSS VD
        Serial Number:      00321258d60c0010
        Firmware Revision:  MV.R00-0
Standards:
        Used: ATA/ATAPI-7 T13 1532D revision 4a
        Supported: 8 7 6 5 & some of 8
Configuration:
        Logical         max     current
        cylinders       16383   16383
        heads           16      16
        sectors/track   63      3
        --
        CHS current addressable sectors:    7864440
        LBA    user addressable sectors:  268435455
        LBA48  user addressable sectors:  468731008
        Logical  Sector size:                   512 bytes
        Physical Sector size:                  4096 bytes
        device size with M = 1024*1024:      228872 MBytes
        device size with M = 1000*1000:      239990 MBytes (239 GB)
        cache/buffer size  = 8192 KBytes (type=DualPortCache)
Capabilities:
        LBA, IORDY(cannot be disabled)
        Queue depth: 32
        Standby timer values: spec'd by Standard, no device specific minimum
        R/W multiple sector transfer: Max = 16  Current = ?
        Recommended acoustic management value: 254, current value: 0
        DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 udma6 *udma7
             Cycle time: min=120ns recommended=120ns
        PIO: pio0 pio1 pio2 pio3 pio4
             Cycle time: no flow control=120ns
Commands/features:
        Enabled Supported:
           *    Power Management feature set
           *    Write cache
           *    Look-ahead
           *    DOWNLOAD_MICROCODE
           *    48-bit Address feature set
           *    Mandatory FLUSH_CACHE
           *    FLUSH_CACHE_EXT
           *    Gen1 signaling speed (1.5Gb/s)
           *    Gen2 signaling speed (3.0Gb/s)
           *    Gen3 signaling speed (6.0Gb/s)
           *    Native Command Queueing (NCQ)
           *    Data Set Management TRIM supported (limit 1 block)      # 해당 부분 TRIM 표시
Security:
        Master password revision code = 65534
        88min for SECURITY ERASE UNIT. 88min for ENHANCED SECURITY ERASE UNIT.
Checksum: correct

2. lsblk -D가 0이 아니면 TRIM 사용 가능

$ lsblk -D
NAME   DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda           0        4K       2G         0
├─sda1        0        4K       2G         0
├─sda2        0        4K       2G         0
├─sda3        0        4K       2G         0
└─sda4        0        4K       2G         0
sdb           0        0B       0B         0
└─sdb1        0        0B       0B         0
sdc           0        0B       0B         0
└─sdc1        0        0B       0B         0
sdd           0        0B       0B         0
└─sdd1        0        0B       0B         0
sde           0        0B       0B         0
└─sde1        0        0B       0B         0
sdf           0        0B       0B         0
└─sdf1        0        0B       0B         0
sdg           0        0B       0B         0
└─sdg1        0        0B       0B         0
sdh           0        0B       0B         0
└─sdh1        0        0B       0B         0
sdi           0        0B       0B         0
└─sdi1        0        0B       0B         0
sdj           0        0B       0B         0
└─sdj1        0        0B       0B         0
sdk           0        0B       0B         0
└─sdk1        0        0B       0B         0

3. TRIM 최대 사용 bytes 확인 -> TRIM을 사용할 수 없으면 0으로 출력

$ cat /sys/block/sda/queue/discard_max_bytes
2147450880

4. TRIM 지원 Bock size 확인 -> TRIM을 사용할 수 없으면 0으로 출력

$ cat /sys/block/sda/queue/discard_granularity
4096

현재 서버의 Public IP 주소 확인

1. ifconfig.co를 통해 현재 서버의 IP 확인

$ curl ifconfig.co
서버의 IP 출력

2. ifconfig.me를 통해 현재 서버의 IP 확인

$ curl ifconfig.me
서버의 IP 출력

ipinfo.io를 통해 현재 서버의 정보를 json 형식으로 출력

$ curl ipinfo.io
{
  "ip": IP주소,
  "city": 도시,
  "region": 지역,
  "country": 국가,
  "loc": 위치,
  "org": 조직,
  "postal": 우편번호,
  "timezone": 시간대,
  "readme": "https://ipinfo.io/missingauth"
}                                                                                         

  • Disk의 read/write 통계지표 및 CPU 사용률, queue 대기열 길이 등 io에 대한 지표를 실시간으로 볼 수 있는 유용한 tool
  • iostat 지표로 부하(read/write) 주는 job의 블록 크기, 부하 크기, 레이턴시 등의 정보를 확인 가능
  • Linux kernel에서 IO 발생 시 CPU와 device의 사용률 정보를 /proc/diskstats, 또는 /sys/block/[device]/stat에 저장
  • kerenl에선 해당 diskstats 파일에 기록된 정보를 바탕으로 값들을 계산해서 iostat 지표에 출력
  • iostat 필드 중 대표적으로 많이 보는 %util 필드의 경우 아래와 같이 계산하여 출력
  • iostat는 Disk에 문제가 발생할 때 주로 보게 되는 툴이지만, Nvme나 SSD에서는 %utils가 의미 X
  • %util 지표 외에 await과 read/write throughput(xx MB/s) 지표와, nand 제품의 성능 한계치(별도의 부하 테스트나 제품 공식 성능 자료 참고)와 비교하며 모니터링에 참고
  • iostat 외에 iotop, blktrace, vmstat, perf, flo 등 다양한 툴로 다른 레벨까지 모니터링
  • %util 계산 방법

    1. io request에 대한 응답 시간을 통해 산출

    2. 응답 시간은 tot_ticks을 이용해 계산

    3. io 함수 호출 시마다 디스크가 처리한 응답 시간(tick) 만큼 더하는 방식

    4. io가 시작된 시점과 완료된 시점을 추적하여 계산

    5. a=>b, c=>d 사이의 시간을 카운터에 누적

    6. 해당 값을 계산하는 코드 → in_flight 인 경우 now - then 값이 추가되는 방식


iostat 설치 방법

$ yum install -y sysstat

iostat 명령어 옵션

  • 자주 사용하는 iostat 명령어 옵션

    # iostat -dxm 1 -p ALL | grep -iw "device\|sda4\|nvme0n1" | awk '{now=strftime("%Y-%m-%d %T "); print now $0}'참고
    $ iostat -dxm 1 -p ALL

  • 자주 사용하는 iostat 명령어 옵션에 대한 설명

    1. -d : 디스크 사용량 정보를 출력
    2. -x : 확장 정보 출력
    3. -m : 초당 throughput 출력 → MB/S으로 출력
    4. 1 : iostat 출력 간격을 초로 지정 → 1이면 1초마다 갱신
    5. -p ALL : 시스템에 모든 디바이스를 출력


iostat 출력 값에 대한 설명

1. rrqm/s

  • 큐에 대기 중인 초당 읽기 요청 수.
  • /proc/diskstats의 결과에서 2번째 줄로 출력
  • 장치에 대기 중인 초당 병합된 읽기(read) 요청 수

2. wrqm/s

  • 큐에 대기 중인 초당 쓰기 요청 수.
  • /proc/diskstats의 결과에서 6번째 줄로 출력
  • 장치에 대기 중인 초당 병합된 쓰기(write) 요청 수

3. r/s

  • 초당 읽기 섹터 수
  • /proc/diskstats의 결과에서 1번째 줄로 출력
  • 초당 장치에 발행된 읽기(read) 요청 수
  • OS의 block layer가 아니라 Process가 OS의 커널 영역으로 read/write 함수를 호출한 횟수

4. w/s

  • 초당 쓰기 섹터 수
  • proc/diskstats의 결과에서 5번째 줄로 출력
  • 초당 장치에 발행된 쓰기(write) 요청 수
  • OS의 block layer가 아니라 Process가 OS의 커널 영역으로 read/write 함수를 호출한 횟수

5. rMB/s

  • 초당 읽기 처리 크기 (r/s * 섹터 크기(블록 사이즈 크기))
  • proc/diskstats의 결과에서 3번째 줄로 출력
  • 초당 장치에서 읽은 메가바이트 수

6. wMB/s

  • 초당 쓰기 처리 크기 (w/s * 섹터 크기(블록 사이즈 크기))
  • proc/diskstats의 결과에서 7번째 줄로 출력
  • 초당 장치에 기록된 메가바이트 수

7. avgrq-sz

  • 요청 건수의 평균 크기 ( 1 = 512byte )
  • proc/diskstats의 결과에서 출력값 X
  • 장치에 발행된 요청의 평균 크기(섹터)

8. avgqu-sz

  • 해당 Device에 발생된 request들의 대기 중인 queue의 평균 length
  • proc/diskstats의 결과에서 11번째 줄로 출력
  • 장치에 발행된 요청의 평균 대기열 길이
    avgqu-sz = await / svctm * %util
  • 상세 설명 : avgqu-sz는 io스케줄러 queue + 디스크 queue의 대기열을 포함된 평균 수치
  • io 스케줄러 queue depth 경로 → sys/block/[device]/queue/nr_requests
  • 디스크 queue depth 경로 → /sys/devices/pci0000:17/0000:17:00.0/0000:18:00.0/host0/target0:2:0/0:2:0:0/queue_depth
  • avgqu-sz 수치보다 await 수치가 훨씬 높으면 디스크 쪽에서 병합이 있다고 판단

9. await

  • 레이턴시 값 (svctm + waiting in the queue)
  • proc/diskstats의 결과에서 4번째 줄로 출력
  • 처리할 장치에 발행된 I/O 요청의 평균 시간(밀리초)
  • 대기열의 요청에 소요된 시간과 해당 요청을 처리하는 데 소요된 시간이 포함
    await = svctm + however_long_in_quere
  • 상세 설명 : await는 io 완료 시간 + 스케줄러에서 대기 큐에 소비된 시간을 합친 값
  • 해당 값은 스케줄러, 드라이버, 컨트롤러, 실제 물리 디스크 단 까지 모든 대기 시간이 포함

10. svctm

  • 장치에 발행된 I/O 요청의 평균 서비스 시간(밀리초)
  • proc/diskstats의 결과에서 출력값 X
  • svctm의 조기 처리에 대한 조치로 인해 10 io 가 발생하면 10 ms 만에 1 io 는 1 ms 로 처리해 svctm에 1.00 일이 발생

11. %util

  • proc/diskstats의 결과에서 10번째 줄로 출력
  • 장치에 I/O 요청이 발행된 CPU 시간의 백분율(장치의 대역폭 사용률).
  • %util 값이 100%에 가까울 때 장치 포화가 발생
  • Disk 가 버틸 수 있는 한계치를 %로 표시해 주는 필드
  • 스핀들 디스크에선 잘 처리해서 보여 주지만, 병렬 io처리를 하는 nand제품이나 cache가 달린 Raid 구성 또는 스토리지에서는 신용할 수 없는 정보


iostat 예제 출력 결과로 내용 설명

  • iostat 명령어 출력 설명
    1. 부하 → 4k 블록 사이즈로 read 10MB, write 10MB 부하 확인(read는 r/s, write는 w/s)
    2. rMB/s 출력 → 4k x 1024(r/s) = 4MB (rMB/s)
    3. wMB/s 출력 → 4k x 1024(w/s) = 4MB (wMB/s)
    4. 부하준 블록 사이즈 크기 확인 → 8(avgrq-sz 값) x 512 (byte) = 4kb, 만약 8k 블록 사이즈로 부하를 주면 avgrq-sz는 16으로 표시
    5. %util 값 → 1025(r/s) + 1025(w/s) / (0.32(svctm) / 10)
  • iostat 명령어 출력 결과



iostat 지표는 disk속도나, 문제가 있을 때 확인 → 의미 있는 지표 확인 방법

  1. 장착된 디스크의 종류 확인 → sata, sas, ssd, nvme 등 물리적 디스크 종류 확인
  2. raid 구성 확인 →raid는 캐시가 있는, write-back인지. 직접 쓰기하는 write-through인지 확인
  3. 현재 구성된 디스크의 성능 한계치를 파악
    • hdparm 명령어로 하드 디스크 점검 및 성능 측정
    • ssd의 경우 read 300MB에 write 80MB 정도
    • benchmark를 통해 디스크 성능표도 참고 필요
  4. rMB/s, wMB/s로 현재 부하 크기를 보고, await 지표가 1 (ms) 이상 넘는지 등을 확인
  5. SATA나 SAS는 await 값을 유심히 볼 필요 → await 값은 레이턴시 지표로 보면 되고, 디스크 부하는 크지 않은데 await 값이 순간 올라가는 경우가 종종 있음(Nvme, SSD에는 의미 없음)


iostat %util, svctm 지표 오류

  • 스핀들 디스크 (SATA, SAS 등)의 경우 플래터가 돌면서 헤더가 지정된 섹터를 찾아 한번에 한 가지 job씩 처리함 → 병렬 처리가 안 되는 구조로, iostst 지표의 값이 정확한 지표라 판단 가능
  • Nand (Nvme, ssd)의 경우 die 칩셋이 채널로 구성되며, 각 채널별로 io를 분산 처리됨 → 병렬 처리가 가능(병렬 처리하여 퍼포먼스를 높이더라도 iostat 툴에서는 계산하지 못함)
  • SSD 병령 처리 구성
  • Nand 제품에선 적은 부하를 줘도 %util 에선 과도하게 높은 지표를 출력 가능
  • nvme 디스크에 (fio 테스트, 4k 블록 사이즈, radomwrite 부하) numjob을 늘려가며 테스트 결과를 확인하면, job=3부터 이미 %util 은 최대치를 도달
  • 이론상 %util이 100이 되면 디스크 포화 상태를 의미하지만 부하를 더 줄수록 write 성능 증가 → 즉, %util 필드 자체는 의미 X

참고 : https://brunch.co.kr/@lars/7

  • 현재 메모리의 상태를 출력함.
  • 프로세스 정보 , 메모리 사용량 , 스왑 , IO 상태 및 CPU 활동 상황에 대한 정보를 보여준다.

vmstat 명령어 사용 형식

# 첫번째 방법
$ vmstat [옵션]

 # 두번째 방법  -> 예시) vmstat 5 5 (5초 간격으로 1줄씩 5번 생성)
$ vmstat [시간] [반복]

vmstat 명령어 출력 필드

$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 345316  39780 259932    0    0    13     5   53  108  1  0 99  0  0

1. procs 필드

  • r : CPU 접근 대기 중인 실행 가능한 프로세스 수
  • b : I/O 자원을 할당 받지 못해 블록된 프로세스의 수

2. memory 필드

  • swpd : 사용된 가상 메모리의 용량
  • free : 사용가능한 여유 메모리의 용량
  • buff : 버퍼에 사용된 메모리의 총량
  • cache : 페이지 캐시에 사용된 메모리의 용량

3. swap 필드

  • si : swap-in된 메모리의 양(kb)
  • so : swap-out된 메모리의 양(kb), swap-out가 지속적으로 발생한다면 메모리 부족을 의심

4. I/O 필드

  • bi : 블록 디바이스로부터 입력 블록수
  • bo : 블록 디바이스에 쓰기 블록수

5. system 필드

  • in : 초당 발생한 interrupts의 수
  • cs : 초당 발생한 context switchs(문맥교환)의 수

6. CPU 필드

  • us : CPU가 사용자 수준 코드를 실행한 시간 (단위: %)
  • sy : CPU가 시스템 수준 코드를 실행한 시간 (단위: %)
  • id : idle 시간
  • wa : I/O wait 시간

vmstat 명령어 옵션

1. vmstat -a 명령어 → buffer와 cache 대신 active 와 inactive 메모리 사용량에 대한 결과를 출력

  • inactive : 사용되지 않은 메모리의 양
  • active : 사용중인 메모리의 양
    $ vmstat -a
    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
    r  b   swpd   free  inact     active   si   so    bi    bo   in   cs us sy id wa st
    0  0      0 333036 209580 310260    0    0    12     5   52  105  1  0 99  0  0

2.vmstat -d 명령어 → 디스크의 사용량을 출력

  • Reads (읽기)
    1. total : 성공한 모든 읽기 작업 개수
    2. merged : 하나의 I/O로 묶은 읽기 작업 수
    3. sectors : 성공적으로 읽은 섹터 수
    4. ms : 읽기 작업을 하는데 소요된 시간(밀리초)
  • Wrties (쓰기)
    1. total : 성공한 모든 쓰기 작업 개수
    2. merged : 하나의 I/O로 묽은 쓰기 작업 수
    3. sectors : 성공적으로 쓴 섹터 수
    4. ms : 쓰기 작업을 하는데 소요된 시간(밀리초)
  • I/O (입출력)
    1. cur : 현재 수행 중인 I/O 수
    2. sec : I/O를 수행하는데 소요된 시간(초)
      $ vmstat -d
      disk- ------------reads------------ ------------writes----------- -----IO------
      total merged sectors      ms  total merged sectors      ms    cur    sec
      ram0       0      0       0       0      0      0       0       0      0      0
      - 생략 -
      loop7      0      0       0       0      0      0       0       0      0      0
      sr0        0      0       0       0      0      0       0       0      0      0
      sda    10864   5487  541394   55154   6140  14695  166258   47768      0     29
      sdb      874    941    4334     785     24     17     200      47      0      0
      sdc     1889    891   12894    1390    146   7908   64308     847      0      1

vmstat 명령어를 crontab에 활용

  • 시스템의 프로세스 정보 , 메모리 사용량 , IO 상태 , CPU사용률 등의 정보를 vmstat 명령어를 사용하여 매일 23시 30분에 1초단위로 10회씩 check.log 파일에 누적 저장
    # 아래와 같이 등록한 후 출력된 결과 확인
    $ crontab -l
    30 23 * * * vmstat 1 10 >> /var/log/check.log

+ Recent posts