• 리눅스(linux) 서버에 무한정으로 로그인 시도를 할 경우, 언젠가는 보안이 풀릴 위험이 있음
  • 외부에서 무한정으로 로그인 시도할 경우, 최대시도 횟수 설정이 있다면 외부 위협을 어느 정도 벗어날 수 있음
  • 보안 설정에 필요한 pam_tally2 모듈
    1. pam_tally2 모듈은 접속 시도가 계속 틀릴 경우 횟수에 제한을 설정하여 일정 시간 동안 계정 잠금 상태로 설정
    2. pam_tally2 모듈은 대부분의 Linux 배포판에 이미 설치되어 있으며, PAM 패키지에 의해 제어


리눅스 최대 로그인 횟수 설정하기, pam_tally2.so 모듈 사용

  • 리눅스 일반 사용자 계정의 로그인 시도 액세스 설정을 구성하려면 /etc/pam.d/password-auth 파일에 설정 추가

  • /etc/pam.d/password-auth 파일을 열고 아래 설정 추가

    auth       required    pam_tally2.so   deny=5   unlock_time=1800   no_magic_root   reset
    account  required    pam_tally2.so   no_magic_root

  • /etc/pam.d/password-auth 파일의 추가 설정 설명

    1. deny=5 → 5회 시도 후 접근을 거부하고 사용자를 잠급
    2. unlock_time=1800 → 계정은 30분동안 잠김. (수동 잠금을 해제할 때까지 영구적으로 잠그려면 unlock_time를 제거)
    3. no_magic_root → root는 패스워드 잠금 설정하지 않음
    4. reset → 접속 시도 성공 시 실패한 횟수 초기화


리눅스 일반 계정 반복 실패 후 로그인 시도 횟수 확인

  • 새로운 계정을 만들어 로그인 실패시 위 설정한 /etc/pam.d/password-auth 파일 내용이 정상 동작하는지 테스트 확인

  • 새로운 test 계정 생성 후 비밀번호 반복해서 실패

  • test 계정이 더 이상 접속 실패 상태를 확인하기

    # test 계정 생성
    $ adduser test
    
    # 6회 비밀번호 실패 후 test 계정 접속 실패 상태 확인
    $ pam_tally2 -u test
    Login           Failures Latest failure     From
    test                6



리눅스 일반 계정 접속 횟수 초기화

  • test 계정이 반복 실패하여서 잠긴 경우 일시적으로 접속 불가

  • 필요에 따라 접속을 허용해야하는 경우 -r 옵션을 사용하여 리셋해줌

  • pam_tally2 명령어의 -r 옵션은 잠금 실패 리셋을 의미 → 초기화 후 로그인 실패 횟수가 0으로 변경 확인

    $ pam_tally2 -u test -r
    
    # 계정 초기화 확인
    $ pam_tally2 -u test
    Login           Failures Latest failure     From
    test               0

  • grep 명령어는 특정 파일에서 지정한 문자열이나 정규표현식을 포함한 행을 출력 → 들어오는 입력에 대해 주어진 패턴을 포함하는 줄들을 출력
  • grep 명령어는 tail이나 ls, find 등 다양한 명령어와 조합하여 응용 가능


AND 조건 사용법

  • 패턴들이 모두 포함된 줄들을 출력

1. grep 명령어에 AND를 사용하는 첫번째 방법 → grep을 여러번 사용

  • Pipe( | )를 이용해 여러번 사용
    $ iptables -L | grep -i 'DROP' | grep -i 'tcp dpt:snapenetio'
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio

2. grep 명령어에 AND를 사용하는 두번째 방법 → grep에 -E옵션을 사용

  • DROP과 tcp dpt:snapenetio이 모두 포함된 줄을 출력 → 순서에 상관 없이 두 패턴이 동시에 포함된 줄들을 출력
  • .*을 사용하여 AND 사용
    # .*을 사용하여 AND를 표시
    $ iptables -L | grep -iE 'DROP.*tcp dpt:snapenetio'
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio


OR 조건 사용법

  • 패턴들 중 하나라도 포함하고 있는 줄들을 출력

1. grep 명령어에 AND를 사용하는 첫번째 방법 → grep에 -e 옵션을 사용

  • DROP 또는 tcp dpt:snapenetio 중 하나라도 포함된 줄을 출력 → 순서에 상관 없이 두 패턴 중 하나만 있어도 출력
    $ iptables -L | grep -e 'DROP' | grep -e 'tcp dpt:snapenetio'
    ACCEPT     tcp  --  8.8.8.8                anywhere             tcp dpt:snapenetio
    ACCEPT     tcp  --  1.1.1.1                anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:rxmon
    DROP       tcp  --  anywhere             anywhere             tcp dpt:fmtp
    DROP       tcp  --  anywhere             anywhere             tcp dpt:radan-http
    DROP       tcp  --  anywhere             anywhere             tcp dpt:jetdirect
    DROP       tcp  --  anywhere             anywhere             tcp dpt:websm
    DROP       all  --  anywhere             anywhere             /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000

2. grep 명령어에 AND를 사용하는 두번째 방법 → grep에 -E옵션을 사용

  • DROP 또는 tcp dpt:snapenetio 중 하나라도 포함된 줄을 출력 → 순서에 상관 없이 두 패턴 중 하나만 있어도 출력
  • Pipe( | )를 이용해 여러번 사용
    # 파이프라인( | )을 이용하여 OR 사용
    $ iptables -L | grep -E 'DROP|tcp dpt:snapenetio'
    ACCEPT     tcp  --  8.8.8.8                anywhere             tcp dpt:snapenetio
    ACCEPT     tcp  --  1.1.1.1                anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:rxmon
    DROP       tcp  --  anywhere             anywhere             tcp dpt:fmtp
    DROP       tcp  --  anywhere             anywhere             tcp dpt:radan-http
    DROP       tcp  --  anywhere             anywhere             tcp dpt:jetdirect
    DROP       tcp  --  anywhere             anywhere             tcp dpt:websm
    DROP       all  --  anywhere             anywhere             /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000


NOT 조건 사용법 → grep 명령어에 -v 옵션을 사용

  • ACCEPT가 들어있는 줄은 모두 제거

  • 특정 패턴이 포함되지 않은 줄들을 출력

    $ iptables -L | grep -vi ACCEPT
    target     prot opt source               destination
    KUBE-EXTERNAL-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes externally-visible service portals */
    KUBE-FIREWALL  all  --  anywhere             anywhere
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:rxmon
    DROP       tcp  --  anywhere             anywhere             tcp dpt:fmtp
    DROP       tcp  --  anywhere             anywhere             tcp dpt:radan-http
    DROP       tcp  --  anywhere             anywhere             tcp dpt:jetdirect
    DROP       tcp  --  anywhere             anywhere             tcp dpt:websm
    
    target     prot opt source               destination
    KUBE-FORWARD  all  --  anywhere             anywhere             /* kubernetes forwarding rules */
    DOCKER-ISOLATION  all  --  anywhere             anywhere
    DOCKER     all  --  anywhere             anywhere
    
    target     prot opt source               destination
    KUBE-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes service portals */
    KUBE-FIREWALL  all  --  anywhere             anywhere
    
    Chain DOCKER (1 references)
    target     prot opt source               destination
    
    Chain DOCKER-ISOLATION (1 references)
    target     prot opt source               destination
    RETURN     all  --  anywhere             anywhere
    
    Chain KUBE-EXTERNAL-SERVICES (1 references)
    target     prot opt source               destination
    
    Chain KUBE-FIREWALL (2 references)
    target     prot opt source               destination
    DROP       all  --  anywhere             anywhere             /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000
    
    Chain KUBE-FORWARD (1 references)
    target     prot opt source               destination
    
    Chain KUBE-SERVICES (1 references)
    target     prot opt source               destination

참고 URL : https://twpower.github.io/173-grep-and-or-not

  • 디스크와 같이 물리적인 장치를 특정 디렉토리에 연결시켜 주는 것
  • Plug and Play 기능을 수동으로 실행해 주는 것
  • 로컬 장치(하드디스크, USB, CD, DVD) 뿐만 아니라 원격지(NFS, 삼바)까지 포함해서 시스템에 마운트 가능

1. mount 명령어 사용법

  • 경로
    /usr/bin/mount
  • 옵션 사용법
    $ mount [옵션] [장치명]


2. mount 옵션

mount 옵션 설명
-a 옵션 - /etc/fstab에 있는 모든 파일 시스템을 마운트 → 리눅스가 booting할 때 mount -a가 실행
-v 옵션 - 자세한 출력 모드
-f 옵션 - mount 테스트 → 시스템을 호출하지 않고 마운트할 수 있는지 점검
- v 옵션과 함께 사용하면 진행 사항을 자세하게 알 수 있음
-n 옵션 - /etc/mtab 파일에 쓰기 작업을 하지 않고 마운트 → /etc가 읽기 전용 파일시스템인 경우 사용
-r 옵션 - 읽기만 가능하게 마운트 → mount -o ro 디렉토리와 동일한 효과
-w 옵션 - 읽기/쓰기 모드로 마운트 → mount -o rw 디렉토리와 동일한 효과
-t 옵션 - 마운트할 파일시스템 유형을 명시적으로 지정
-o 옵션 - 플래그 뒤에 콤마로 분리한 옵션을 적어줌
-B 옵션 - 기존에 마운트되어 있는 파일 시스템을 다른 위치에 한번 더 마운트
-M 옵션 - 마운트되어 있는 파일 시스템의 마운트 지점을 다른 위치로 이동


3. mount 플래그 옵션

mount 플래그 옵션
설명
defaults - rw, suid, dev, exec, auto, nouser, async 속성을 모두 가짐
auto - 부팅시 자동 마운트
noauto - 부팅시 자동마운트 X
dev - 파일시스템 상의 문자, 블럭 특수 장치를 해석
nodev - 파일시스템 상의 문자, 블럭 특수 장치를 해석 X
exec - 바이너리 실행파일이 실행되는 것을 허용
noexec - 바이너리 실행파일이 실행되는 것을 허용 X
- /tmp 디렉토리와 같이 신뢰할 수 없는 사용자도 접근할 수 있는 경우에 보안 향상
suid - setuid, setgid 의 사용을 허용
nosuid - setuid, setgid의 사용을 거부
ro - 읽기 전용 (read-only)
rw - 읽기/쓰기 (read/write) 가능
async - 파일시스템에 대한 I/O 비동기화
sync - 파일시스템에 대한 I/O 동기화
user - 일반 계정 사용자들도 마운트 할 수 있게 허용
nouser - 일반 계정 사용자가 마운트할 수 없음 → root만 mount 가능
noatime - 파일 접근시간을 업데이트 X- 메일 스풀이나 로그와 같이 I/O가 많은 파일시스템에 유용
remount - 이미 마운트된 파일시스템을 다시 마운트
loop - 다운받은 리눅스 설치 CD 또는 라이브 CD를 마운트하는 경우 가상 파일시스템을 마운트
- 가상 파일시스템을 루프백 마운트이라고 하는 방법 사용
- iso 파일 혹은 img 파일을 사용하는 경우 o loop 사용


4. mount 예제

  • mount된 파일 시스템 목록 출력
    $ mount
    sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
    proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
    devtmpfs on /dev type devtmpfs (rw,nosuid,size=65614092k,nr_inodes=16403523,mode=755)
    securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
    tmpfs on /dev/shm type tmpfs (rw,size=66060288k)
    devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
    [... 아래 내용 생략]

  • 특정 파일시스템 유형을 가진 목록 출력 → t 옵션 사용
    $ mount -t ext4
    /dev/sda2 on / type ext4 (rw,relatime,stripe=64,data=ordered)
    /dev/sda1 on /boot type ext4 (rw,relatime,stripe=256,data=ordered)
    /dev/sdb1 on /cache1 type ext4 (rw,noatime,stripe=64,data=writeback)
    /dev/sdc1 on /cache2 type ext4 (rw,noatime,stripe=64,data=writeback)
    /dev/sdd1 on /cache3 type ext4 (rw,relatime,stripe=64,data=ordered)

  • /dev/sdd1 디바이스를 /cache1으로 mount → 자세한 정보 출력을 위해 v 옵션 사용
    $ mount -v /dev/sdd1 /cache3/
    mount: /dev/sdd1 mounted on /cache3.

  • 이미 마운트된 파일시스템을 다시 마운트 → o 옵션에 remount 사용
    $ mount -o remount /data

  • 마운트되어 있는 파일시스템을 다른 위치에 한번 더 마운트 → B 옵션을 사용하면 다른 위치를 마운트

    # 새로운 디렉토리 생성
    $ mkdir /cache10/
    $ mount -v -B /cache3/ /cache10/
    mount: /cache3 bound on /cache10.
    
    $ df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sdd1       1.5T   77M  1.4T   1% /cache3
    
    # /dev/sdd1 장체에 2개의 디렉토리가 mount
    $ mount | grep /cache3
    /dev/sdd1 on /cache3 type ext4 (rw,relatime,stripe=64,data=ordered)
    $ mount | grep /cache10
    /dev/sdd1 on /cache10 type ext4 (rw,relatime,stripe=64,data=ordered)

  • CD 이미지파일(iso9660)과 USB 디스크 부트 이미지 파일을 시스템에 마운트

    # CD 이미지 파일(iso9660)을 시스템에 마운트
    $ mount -v -t iso9660 -o loop /root/image.iso /mnt/repo
    mount: going to use the loop device /dev/loop0
    /root/image.iso on /mnt/repo type ext3 (rw, loop=/dev/loop0)
    
    # USB 디스크 부트 이미지 파일을 시스템에 마운트
    $ mount -v -o loop /root/boot.img /mnt/repo
    mount: going to use the loop device /dev/loop0
    mount: you didn't specify a filesystem type for /dev/loop0
         I will try type vfat
    /root/boot.img on /mnt/repo type vfat (rw,loop=/dev/loop0)

참고 자료 : https://velog.io/@zoo81001/Linux-Mount-%EB%A7%88%EC%9A%B4%ED%8A%B8
참고 자료 : https://jhnyang.tistory.com/12

  • 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