1. 리눅스의 buffer와 cache

안녕하세요, MJ 입니다.

리눅스 명령어 free 를 설명하다 보니 buffer 와 cache 에 대한 설명이 필요하게 되었는데, 내용이 짧지 않아 별도 포스트를 작성합니다.

우선 buffer 와 cache 는 I/O 성능 향상을 위한 메모리 영역입니다.

  1. buffer/cache 의 필요성 

    블록 디바이스(하드디스크 등 디스크에 해당하는 저장 장치)에 있는 데이터를 읽거나, 새로운 데이터를 저장하는데, 이런 저장 장치는 다른 장치들(메모리,CPU-cache)에 비해 속도가 느립니다. I/O 가 일어날 때 마다 디스크에 접근하여 파일을 읽고 쓴다면 너무 오래 걸려서 다른 프로세스의 처리에 지장이 생길 수 있습니다. 이러한 문제를 해결하기 위해 캐시가 필요하게 됩니다.

  2. 캐시란

    커널은 디스크를 빠르게 사용하고자 메모리의 일부를 디스크의 캐시로 사용합니다.

  3. 캐시의 동작

    한번 읽은 파일의 내용을 캐시 영역에 저장한 뒤, 다시 해당 파일을 읽으려 시도할 때, 메모리 영역에 아까 저장 해 둔 내용을 바로 처리할 수 있게 하는 것 인데, 바로 이 메모리를 buffer, cache 라고 합니다.

  4. buffer 와 cache의 차이

    buffer 와 cache 의 차이에 대해 설명 하기 위해 부가적인 설명을 추가합니다.

    [unix 파일시스템의 구조]

    → 유닉스의 파일시스템은 디렉토리와 파일을 찾기 쉽도록 유지 및 관리하는 시스템으로 4가지의 블록으로 구성되어있습니다.

    1. Boot block → 부팅에 필요한 정보를 담고 있습니다.
    2. Super block → 파일시스템의 어디부터가 i-node 블록인지, Data 블록인지 등의 정보를 담고 있습니다.
    3. i-node List → 파일 하나에 i-node 하나가 할당이 되는데 i-node 는 파일의 메타 데이터를 갖고 있습니다. 이 i-node 묶음으로 파일의 퍼미션, 소유자, 크기, inode 번호 등의 정보를 갖고있습니다.
    4. Data block 데이터가 저장되는 영역으로 각 데이터 블록은 한번에 하나의 파일만 할당이 될 수 있습니다.

    buffer 와 cache 의 차이를 설명하기에 앞서,
    buffer 는 buffer cache,
    cache 는 page cache
    용어를 정정하고 차이점을 설명 드립니다.

    buffer cache 는 Super Block 과 i-node list 에 해당하는 메타 데이터를 저장합니다. 디렉토리를 읽고자 하는 경우에는 디렉토리에 포함되어있는 파일들의 i-node block 들을 buffer cache 에 저장하고, 다음에 다시 그 파일에 접근하게 되면 buffer cache 에 존재하는 값을 가져다가 바로 보여주게 됩니다. 파일로의 접근을 빠르게 수행하기 위한 캐시라고 볼 수 있고,

    page cache 는 한번 읽었던 파일의 내용을 저장하여 동일한 파일로 I/O 요청이 일어나면, 디스크로부터 다시 파일의 내용을 읽어 올 필요가 없이, page cache 에 저장 된 내용을 보여줄 수 있어 I/O 성능이 향상 될 수 있습니다.

    → buffer (buffer cache)는 파일을 빠르게 접근 하기 위한 캐시, cache (page cache)는 파일의 내용을 빠르게 확인 하기 위한 캐시 가 되겠습니다.

    요청이 read 일때는 이렇습니다.


    write 요청이 일어나게되면, page cache 로 데이터를 작성하게 됩니다.

    아직 디스크에 저장하지 않은 이 데이터는 페이지 테이블이 수정 된 것이라는 의미로 dirty 플래그를 붙이게 되고, 이 플래그가 붙은 페이지를 dirty page 라고 부릅니다.
    dirty page 는 커널의 백그라운드로 처리되어 쓰기 작업에서도 메모리를 활용하여 성능이 향상됩니다.

     

    읽어주신 분들이 이해가 잘 되셨으면 좋겠습니다. 


        문의사항은 댓글을 달아 주시면 성심껏 답변 드리겠습니다.

            감사합니다.

7. free

안녕하세요, MJ 입니다.


리눅스 시스템의 메모리 정보를 확인하기위해 free 명령어를 사용 할 수 있습니다.


free 명령어에 대해 알아보겠습니다.

 

[free 명령어 결과]

[root@run-linux ~]# free               total        used        free      shared  buff/cache   available
Mem:         3747544      352632     3416564        8748      200580     3394912
Swap:        2097148           0     2097148

===> free 명령어 결과로 키로바이트 단위로 확인합니다.

6. df

안녕하세요, MJ 입니다.

df 명령어에 대해 작성 해 봅니다.

: 마운트 된 파일 시스템의 사용량을 확인하는 명령어입니다.

df 명령어 결과를 확인 해 보겠습니다.

* df 명령어 수행결과

[df 명령어 수행결과]

 : 명령어 수행 결과에서 여러가지 정보가 확인됩니다.

필드명 설명
Filesystem 마운트 장치
1K-blocks 파티션의 크기
Used 사용된 용량
Available 사용할 수 있는 용량
Use% 사용된 용량의 백분율
Mounted on 마운트 된 디렉토리

옵션 없이 df 명령어 수행 결과에서 확인되는 필드의 설명 입니다. 

외에도 -T 옵션을 추가하면 파일시스템 타입이 기록되는 Type 필드가 추가로 확인됩니다.


도움말 입니다.

<[root@run-linux ~]# df --help
Usage: df [OPTION]... [FILE]...
Show information about the file system on which each FILE resides,
or all file systems by default.

Mandatory arguments to long options are mandatory for short options too.
  -a, --all             include pseudo, duplicate, inaccessible file systems
         : 중복 또는 액세스 할 수 없는 파일시스템을 포함하여 모두 확인 합니다.

  -B, --block-size=SIZE  scale sizes by SIZE before printing them; e.g.,
                           '-BM' prints sizes in units of 1,048,576 bytes;
                           see SIZE format below
         : -BM (메가바이트), -BG (기가바이트), -BK (키로바이트), -B1000 (1000바이트단위)
          출력되는 용량의 단위를 지정합니다.


      --direct          show statistics for a file instead of mount point

  -h, --human-readable  print sizes in powers of 1024 (e.g., 1023M)
         : 사람이 읽기 좋은 형태로 출력됩니다.

  -H, --si              print sizes in powers of 1000 (e.g., 1.1G)
         : 고정 단위가 아니라 크기에 맞게 단위를 표시하고 읽기 좋은 형태로 출력됩니다.

  -i, --inodes          list inode information instead of block usage
         : 아이노드 사용량이 표시됩니다.

  -k                    like --block-size=1K
        : 키로바이트 단위로 사용량이 표시됩니다.

  -l, --local           limit listing to local file systems
        : 로컬 장치만 출력합니다.

      --no-sync         do not invoke sync before getting usage info (default)
      --output[=FIELD_LIST]  use the output format defined by FIELD_LIST,
                               or print all fields if FIELD_LIST is omitted.
  -P, --portability     use the POSIX output format
        : 한 줄로 출력됩니다.

      --sync            invoke sync before getting usage info
      --total           elide all entries insignificant to available space,
                          and produce a grand total
  -t, --type=TYPE       limit listing to file systems of type TYPE
        : 지정한 파일시스템만 출력.

  -T, --print-type      print file system type
        : 파일시스템 이름을 함께 출력.

  -x, --exclude-type=TYPE   limit listing to file systems not of type TYPE
        : 출력에서 제외 할 파일시스템을 지정.

  -v                    (ignored)
      --help     display this help and exit
      --version  output version information and exit

Display values are in units of the first available SIZE from --block-size,
and the DF_BLOCK_SIZE, BLOCK_SIZE and BLOCKSIZE environment variables.
Otherwise, units default to 1024 bytes (or 512 if POSIXLY_CORRECT is set).

The SIZE argument is an integer and optional unit (example: 10K is 10*1024).
Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
Binary prefixes can be used, too: KiB=K, MiB=M, and so on.

FIELD_LIST is a comma-separated list of columns to be included.  Valid
field names are: 'source', 'fstype', 'itotal', 'iused', 'iavail', 'ipcent',
'size', 'used', 'avail', 'pcent', 'file' and 'target' (see info page).

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Full documentation <https://www.gnu.org/software/coreutils/df>
or available locally via: info '(coreutils) df invocation'


df 명령어에 대해 간략하게 알아보았습니다.


5. uname

안녕하세요, MJ 입니다.

uname 명령어에 대한 내용을 작성 합니다.


uname 명령어는 시스템의 정보 중 일부를 출력하는 명령어 입니다.

주 목적은 커널버전을 확인하는데에 사용되지만 그 외에 다른 정보도 함께 확인 할 수 있습니다.

 

우선 도움말을 확인 해 보겠습니다.


 

[root@run-linux ~]# uname --help

Usage: uname [OPTION]...
Print certain system information.  With no OPTION, same as -s.

  -a, --all                print all information, in the following order,
                             except omit -p and -i if unknown:
  -s, --kernel-name        print the kernel name
  -n, --nodename           print the network node hostname
  -r, --kernel-release     print the kernel release
  -v, --kernel-version     print the kernel version
  -m, --machine            print the machine hardware name
  -p, --processor          print the processor type (non-portable)
  -i, --hardware-platform  print the hardware platform (non-portable)
  -o, --operating-system   print the operating system
      --help     display this help and exit
      --version  output version information and exit

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Full documentation <https://www.gnu.org/software/coreutils/uname>
or available locally via: info '(coreutils) uname invocation'
 

4. cat

안녕하세요, MJ 입니다.

cat 명령어는 일반 파일을 터미널상에 출력하는 명령어 입니다.

cat 명령어에 대해 알아보겠습니다.


 

cat 명령어의 도움말을 먼저 확인하고 자주 사용되는 옵션과  cat 명령어 사용법을 설명하겠습니다.

도움말

펼치기/접기

옵션 설명

-A: -vET 옵션과 같습니다.
-b: 빈줄에는 줄번호를 매기지 않습니다.
-e: -vE 옵션과 같습니다.
-E: 라인의 끝을 $ 문자로 표시합니다.
-n: 줄번호를 표시합니다.
-s: 반복적 인 빈 출력 라인을 억제합니다.
-t: -vT 옵션과 같습니다.
-T: 탭 문자를 ^T  로 대체하여 표시합니다.
-v: 엔터와 탭 문자를 보이도록 하지 않고, 라인의 끝에 윈도우의 줄바꿈문자(캐리지리턴:CR)
     를 보여줍니다.

캐리지 리턴 설명

키보드의 'Enter' 키에 그림을 보면,
아래로 가다가 왼쪽으로 꺾여있는 화살표가 그려져 있습니다.

엔터를 누르게 되면 아래로 가는 동작을 한 뒤에, 왼쪽으로 가는 동작을 한다는 뜻 입니다.
이는 윈도우에서의 동작으로 엔터 한번 입력에 두가지의 동작을 하게 됩니다.

하지만 리눅스에서는 엔터가 아래로 한번만 동작합니다.
리눅스 에서도 윈도우와 같이 아래로 간 다음 왼쪽으로 가면 문제가 없겠지만,
리눅스와 윈도우에서는 메모리에 데이터를 저장하는 방식이 달라, 윈도우와 리눅스는
그 순서가 바뀌게 됩니다. 리눅스에서는 왼쪽으로 먼저 간 다음, 아래로 가도록 동작하게 되어
내가 입력 한 모든 문자가 모두 지워지고 아래로 가게 됩니다.
(리눅스-리틀엔디안,윈도우-빅엔디안 차이)

그래서 텍스트 파일을 vi 로 열어보거나 하면 잘 보이긴 하지만, cat 이나, 스크립트 작성에서
파일을 실행 할때에는 작성자가 원하는대로 동작하지 못하게 되어, 리눅스에서는 이 줄바꿈 문자에 대해 신경을 쓰지 않을 수 없습니다.

그리하여 리눅스에서는 줄바꿈 문자를 LF (Line Feed)
윈도우에서의 줄바꿈문자는 CRLF 로 표현 합니다.
(Carriage Return)


모든 옵션에 대해 실습을 하지는 않지만, 다음 내용에 대해 실습을 하신다면 리눅스 엔지니어로 일 하시는 중에도 전혀 불편함 없이 사용 하실 수 있을것이라고 생각됩니다.

 

시작합니다.

 

1. 리눅스 파일 출력

cat 명령어 뒤에 파일 이름을 주면 파일의 내용을 출력할 수 있습니다.

[run-linux cat]$ ls -l
total 12
-rw-r--r-- 1 root root 18 Sep 24 15:11 A_file
-rw-r--r-- 1 root root 18 Sep 24 15:11 B_file
-rw-r--r-- 1 root root 18 Sep 24 15:11 C_file
[run-linux cat]$ cat A_file
A_file: testprint
[run-linux cat]$ cat A_file B_file
A_file: testprint
B_file: testprint
[run-linux cat]$ cat A_file B_file C_file
A_file: testprint
B_file: testprint
C_file: testprint

내 리눅스 서버, 대체 뭐가 문제야?

내 리눅스 서버, 대체 뭐가 문제야? 안녕하세요. 오늘은 리눅스 서버가 버벅거릴 때, 원인을 파악하는 방법에 대해 알아보려고 해요. 서버의 성능 저하 원인을 찾는 것은 시스템 관리에서 매우 중요한 부분이에요. CPU, 메모리 사용량부터 수상한 프로...

가장 많이 본 글