반응형

타 프로젝트에서 지원 요청 온 것 들 중 하나가 리눅스 시스템에서의 메모리 관리입니다.
아시다시피 리눅스 시스템에서는 BSD계열이나 아니냐 등의 이유로 메모리 확인 방법은 조금씩 차이가 납니다.
일단 리눅스에서 메모리 확인 방법들에 대해 정리해봅니다.

1.top

개인적으로 많은 용도로 가장 빈번하게 활용하고 있습니다.^^;
총 메모리 사용량을 모니터링하는데 주로 사용하는데, 프로세스 당 메모리와 CPU사용량도 보여줍니다. 아래 설명할 free 명령어처럼 buffer와 cache 정보도 확인할 수 있습니다.
여기서 짚고 넘어가야 할 것은, 기본적으로 리눅스는 가장 빠른 성능을 위해 실행 중인 프로세스들이 요청하는 메모리를 제외한 메모리들 중 거의 대부분을 Disk cache로 사용한다는 점이다.
top 명령어를 실행해 보면 이를 알 수 있는데, Mem영역의 free 메모리 사이즈보다 Swap영역의 cached Mem 사이즈가 훨씬 큰 것을 볼 수 있다.
명령어를 실행하면 실시간 모니터링이 되는데, 옵션 키들을 사용할 수 있다.
shift + m - 메모리 사용량 우선순위 정렬
shift + p - CPU 사용량 우선순위 정렬
shift + t - 실행 시간 우선순위 정렬
shift + b -  상단 정보를 블럭 형태로 표시(htop과 유사)
1 - CPU 개수별 사용량
space bar - Refresh
u - 해당 유저의 프로스세만 표시
k - 해당 프로세스 kill


예)
top - 12:36:47 up 7 days,  5:55,  4 users,  load average: 1.40, 1.16, 1.03
Tasks: 222 total,   2 running, 219 sleeping,   0 stopped,   1 zombie
%Cpu(s):  7.5 us, 15.7 sy,  0.2 ni, 76.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  12286940 total, 12027384 used,   259556 free,   415392 buffers
KiB Swap: 10239996 total,      240 used, 10239756 free.  1674928 cached Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                 
 2111 mingyu.+  20   0 1482888 112584  59068 S  19.2  0.9   1534:59 compiz      
...

전체 물리 메모리 : 12286940 total (:=실 가용 메모리 + 실 사용 메모리)
실 가용 메모리 = free + buffers + cached Mem
: 259556 free + 415392 buffers + 1674928 cached Mem
실 사용 메모리 = used - (buffers + cached Mem)
: 12027384 used - (415392 buffers + 1674928 cached Mem)

2. htop

top 명령어의 또 다른 버전(???)!
개인적으로 잘 쓰지 않는데, 그 이유는 따로 설치를 해야하는 Util 명령어이다.
하지만 취향에 따라 자주 이용하는 사람들도 있으니 한번 테스트해보시고 판단해보시길^^;
조금 더 다양한 옵션이 있으니 활용해 보시길^^;

3. free

메모리 사용량을 확인할 때 사용하는 가장 단순하고 쉬운 명령어.
커널에서 사용하는 공유메모리/버퍼 양 표시
-/+ buffers/cache: 현재 cache 메모리에서 버퍼링된 사용량

-m : MB단위로 데이터 표시
-b : byte단위로 데이터 표시
-k : kilo byte 단위로 데이터 표시
-t : 맨 마지막에 total 량 표시
-o : buffer/cache 표시 안함
-s : 지정한 초단위(Regular interval)로 refresh
-l : low & High 메모리 크기 통계
-V : free명령의 버전 표시

예) free -m
                        total       used       free     shared    buffers     cached
Mem:         11998      11646        352         73        369       1581
-/+ buffers/cache:       9695       2303
Swap:         9999          0       9999

전체 물리 메모리 : 11998 MB (:=실 가용 메모리 + 실 사용 메모리)
실 가용 메모리 2303 MB(free) = free + buffers + cached Mem
: 352 MB(free) + 369 MB(buffers) + 1581 MB(cached Mem)
실 사용 메모리 9695 MB(used) = used - (buffers + cached Mem)
: 11646 MB(used) - (369 MB:buffers + 1581 MB cached Mem)

참고) from zetawiki
MEM_TOTAL=`free | grep ^Mem | awk '{print $2}'`
MEM_FREE1=`free | grep ^Mem | awk '{print $4}'`
MEM_FREE2=`free | grep ^-/+ | awk '{print $4}'`
MEM_NOMINAL=`echo "100-(100*$MEM_FREE1/$MEM_TOTAL)" | bc -l`
MEM_ACTUAL=`echo "100-(100*$MEM_FREE2/$MEM_TOTAL)" | bc -l`
echo NOMINAL=${MEM_NOMINAL:0:5}% ACTUAL=${MEM_ACTUAL:0:5}%

4. vmstat -s

아래에서 다룰 proc 명령어와 같이 메모리 사용량 통계를 나타낸다.
예)
     12286940 K total memory
     11925908 K used memory
      3084736 K active memory
      1780388 K inactive memory
       361032 K free memory
       378504 K buffer memory
      1619516 K swap cache
     10239996 K total swap
          240 K used swap
     10239756 K free swap
     18765788 non-nice user cpu ticks
       222821 nice user cpu ticks
     34041747 system cpu ticks
    196753601 idle cpu ticks
       137429 IO-wait cpu ticks
          817 IRQ cpu ticks
        27674 softirq cpu ticks
            0 stolen cpu ticks
     29867564 pages paged in
     71060804 pages paged out
            0 pages swapped in
           61 pages swapped out
   1121367295 interrupts
   2630490277 CPU context switches
   1456695684 boot time
        34179 forks


5. /proc/meminfo

/proc/meminfo 파일을 읽으면 아래와 같이 vmstat -s, free 명령어와 유사한 메모리 사용량을 확인할 수 있다. 단, /proc 파일 시스템은 실제 파일이 아니라 커널과 시스템에 대한 동적인 정보를 담고 있는 가상 파일이다.
예) cat /proc/meminfo
MemTotal:       12286940 kB
MemFree:          354672 kB
Buffers:          378504 kB
Cached:          1619800 kB
SwapCached:            0 kB
Active:          3092044 kB
Inactive:        1779796 kB
Active(anon):    2097608 kB
Inactive(anon):   851532 kB
Active(file):     994436 kB
Inactive(file):   928264 kB
Unevictable:          32 kB
Mlocked:              32 kB
SwapTotal:      10239996 kB
SwapFree:       10239756 kB
Dirty:              1164 kB
Writeback:             0 kB
AnonPages:       2873720 kB
Mapped:          6757036 kB
Shmem:             75504 kB
Slab:             488308 kB
SReclaimable:     393892 kB
SUnreclaim:        94416 kB
KernelStack:        5968 kB
PageTables:        51824 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    16383464 kB
Committed_AS:   13987488 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      160940 kB
VmallocChunk:   34359492360 kB
HardwareCorrupted:     0 kB
AnonHugePages:   1406976 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       92416 kB
DirectMap2M:    12472320 kB

(참고)
프로세스의 PID를 알고 있다면
> cat /proc/"PID"/status 입력 시
VmSize : 전체 할당된 가상 메모리 크기
VmRSS : 실제 물리 메모리가 할당된 크기
VmLck : Swapout될 수 없는 메모리 크기
VmData : Heap 영역
VmStk : Stack 영역
VmExe :  실행코드 영역 (전역변수/실행코드)
VmLib : 동적 연결된 라이브러리 영역

C Code )
char cmd[1024];
sprintf(cmd, "/proc/%d/status", getpid();
FILE* fp = fopen(cmd, "r");
if(fp == NULL) return;

int nVmSize =0;
int nVmRss =0;

while(fgets(cmd, 1024, fp) != NULL) {
  if(strstr(cmd, "VmSize"))  {
    char t[32];
    char size[32];
    sscanf(cmd, "%s%s", t, size);
    nVmSize = atoi(size);
  } else if(strstr(cmd, "VmRSS")) {
    char t[32];
    char size[32];
    sscanf(cmd, "%s%s", t, size);
    nVmRss = atoi(size);
    break;
  }
fclose(fp);

6. ps

> ps -ef --sort -rss
rss(Resident Set Size) : 물리 메모리를 실제 점유하고 있는 크기
가장 위에 있는 프로세스가 물리 메모리를 가장 많이 점유하고 있음!

> ps -eo user,pid,ppid,rss,size,vsize,pmem,pcpu,time,comm --sort -rss | head -n 11
예)
USER       PID  PPID   RSS  SIZE    VSZ %MEM %CPU     TIME COMMAND
mingyu.+  4885  4860 6622604 1662480 8779996 53.8 54.1 3-23:01:30 VirtualBox
mingyu.+ 10870  1771 955232 2542152 3321996  7.7 10.0 12:45:13 firefox
mingyu.+  5824  5821 895860 4640832 5418932  7.2 1.6 02:54:53 java
mingyu.+  2235  1771 235232 592760 1280776  1.9 0.0 00:08:27 thunderbird
mingyu.+ 31928  1771 215452 1913348 2753128  1.7 0.0 00:00:19 software-center
...

7. dmidecode

설치된 RAM 하드웨어 정보 표시.
type 17이 RAM. (그 외 L1/L2 cache 등)
예) dmidecode -t 17
# dmidecode 2.12
SMBIOS 2.7 present.
Handle 0x001A, DMI type 17, 34 bytes
Memory Device
 Array Handle: 0x0019
 Error Information Handle: 0x001C
 Total Width: 64 bits
 Data Width: 64 bits
 Size: 8192 MB
 Form Factor: SODIMM
 Set: None
 Locator: ChannelA-DIMM0
 Bank Locator: BANK 0
 Type: DDR3
 Type Detail: Synchronous
 Speed: 1333 MHz
 Manufacturer: Samsung
 Serial Number: 2343574B
 Asset Tag: 0123456789
 Part Number: M471B1G73BH0-CH9 
 Rank: Unknown
 Configured Clock Speed: 1333 MHz


8. GUI Tools

gnome - gnome-system-monitor
KDE - ksysguard

반응형
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,
반응형

오늘은 Linux에서 postgresql 12 버전에 대한 설치 및 업그레이드 방법에 대해 포스팅 하려고 합니다.

 

먼저 Postgresql이 기존 Linux에서 설치가 되어있다면, 제거하고 재설치 하는 방법으로

진행하겠습니다.

(* 업그레이드가 아닌 설치만 하시는 분들은 5)의 내용부터 진행하시면 됩니다.)

 

1) 기존의 Postgresql 서비스 중지

# systemctl stop postgresql-9.6
# systemctl disable postgresql-9.6 

 

2) 기존의 Postgresql 데이터 삭제

# rm -rf /var/lib/pgsql

 

3) 기존의 Postgresql 계정 제거

# userdel postgres

 

4) 기존의 Postgresql 패키지 제거

# yum remove *postgres*

 

5) yum repository 업데이트

# rpm -Uvh https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

 

6) Postgresql 12버전 설치

# yum -y install postgresql12-server postgresql12-contrib

 

7) Postgresql 기본 데이터베이스 생성

# /usr/pgsql-12/bin/postgresql-12-setup initdb

 

8) Postgresql 12 서비스 등록 및 시작

# systemctl enable postgresql-12
# systemctl start postgresql-12

 

9) Postgresql 계정 생성

# su postgres
# psql postgres
// CREATE USER [계정아이디] PASSWORD '[계정패스워드]' SUPERUSER;
# CREATE USER clovir PASSWORD 'vmware1!' SUPERUSER;

 

10) 외부 접근 허용 설정

- 외부 접근 허용이 될 수 있도록 설정해놔야 다른 IP에서 DB툴 또는 JDBC connection을 하여

Linux 서버에 설치된 Postgresql DB를 제어할 수 있습니다.

// postgresql.conf 파일 수정
 # vi /var/lib/pgsql/12/data/postgresql.conf
 listen_addresses='*'
 으로 수정
 
// pg_hba.conf 파일 수정
 # vi /var/lib/pgsql/12/data/pg_hba.conf
 # TYPE  DATABASE        USER            ADDRESS                 METHOD 이 위치 아래에
 host    all             all             0.0.0.0/0               md5 
 으로 추가

 

11) Postgresql 서비스 재시작

# systemctl restart postgresql-12

 

위 내용이 문제없이 진행이 되었다면, 

# service postgresql-12 status

명령어를 입력 했을 때 아래 이미지와 같이 active 상태로 나타나게 됩니다.

postgresql service 상태 확인

 

또한 아래 이미지와 같이 DB tool을 사용하여 정상적으로 연결 되는것을 확인할 수 있습니다.

 

 

 

지금까지 Linux에서 postgresql 12 버전에 대한 설치 및 업그레이드 방법에 대한

포스팅이였습니다.

반응형
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,
반응형

셸이란?


커널과 사용자간 다리 역할을 하는것. 사용자로부터 명령을 받아 해석하고 실행하는 역할.
리눅스는 본셸(sh)을 기본으로 ksh와 csh 장점을 결합한 bash를 표준으로 한다.

  • sh : 본셸(Bourne Shell) 1977년 AT&T 벨 연구소에 근무하는 스티븐 본이 개발한 유닉스 버전 7의 기본 셸
  • bash : 1989년 브라이언 폭스가 GNU 프로젝트를 위해 개발한 배시셸. 본셸을 기반으로 만들어졌다.
  • csh : C 셸 1978년 버클리 대학의 빌 조이가 개발. C 언어를 기반으로 만들어졌다. 히스토리 기능, Alias 기능, 작업 제어 등 유용한 기능들을 포함하였다.
  • tcsh : 1975년 켄 그리어가 티넥스 운영체제에 명령행 완성 기능을 반영하고 csh와 통합해서 탄생
  • ksh : 콘셸(Korn Shell) 198년 AT&T 벨 연구소에 근무하는 데이비드 콘이 개발. sh를 확장해서 만들어졌다. 작업 제어, Alias, 히스토리 기능 및 vi와 같은 명령행 편집 기능, 명령행 완성 기능 등을 제공한다.

셸 확인
echo $SHELL
셸 변경
chsh 입력 후 변경하려는 셸의 절대 경로
변경 가능한 셸 확인 chsh -l
사용자 셸 정보 확인
/etc/passwd 의 7번째 필드 내용

셸에선 0 : 참 1 : 거짓

셸 환경 설정


  • 셸 변수 : 특정한 셸에서만 적용되는 변수 '변수명=값' 으로 선언 'echo $변수명' 으로 확인
  • 환경 변수 : 약속으로 정해진 변수명을 사용하고 bash에서는 PATH, SHELL 등과 같이 대문자로 지정되어있다. env 환경변수리스트확인

환경 변수


미리 정해진 환경 변수 목록

  • HOME : 사용자 홈 디렉터리
  • PATH : 실행 파일을 찾는 디렉터리 경로
  • LANG : 셸 사용 시 기본으로 지원되는 언어
  • PWD : 현재 작업 디렉터리
  • SHELL : 사용자 로그인 셸
  • USER : 사용자 이름
  • PS1 : 프롬프트 변수
  • PS2 : 2차 프롬프트 변수
  • HISTFILE : 히스토리 파일의 절대 경로
  • HISTSIZE : 히스토리 파일에 저장되는 개수
  • HISTFILESIZE : 히스토리 파일 크기
  • HOSTNAME : 시스템 호스트명
  • TMOUT : 미사용시 로그아웃 타임
  • UID : 사용자 UID

명령어 History


history 명령어 입력시 히스토리 리스트를 출력하며 기록 리스트는 .bash_history 라는 파일에 기록된다. 명령어 '!'로 대체할 수 있다.
명령문

  • !! : 마지막에 사용한 명령어 실행
  • !n : n번째 사용한 명령 실행
  • !-n : 사용한 명령 목록에서 역으로 n번째
  • !문자열 : 최근에 사용한 명령 중 '문자열'로 시작하는 명령 실행
  • !?문자열? : 최근에 사용한 명령 중 '문자열'을 포함하고 있는 명령 실행
  • ^문자열1^문자열2 : 마지막 명령문의 '문자열1'을 '문자열2'로 대체하여 실행

그룹 명령 실행


  • : : 한 줄에 여러 명령 나열 실행, 입력 순서대로 순차 처리
  • || : 논리적 OR, 앞 명령이 성공이면 결과 출력, 실패시 뒤 명령을 실행하여 출력
  • && : 논리적 AND, 앞 명령이 성공해야 뒤 명령 실행

tee


파이프 연결 출력을 두 갈래로 나눌 때 사용되는 명령. 이것도하고 다음것도 하고
tee [option] [파일]

  • i : 인터럽트 무시
  • a : 덮어쓰지 않고 내용 뒤에 추가

ex) ll | tee test.txt |more
ll 결과를 text.txt에 쓰고 more로 화면에도 출력

산술 연산


expr 명령으로 산술 연산 가능

expr 값 연산자 값
연산자 목록 : +, -, *, /, %

* 사용시 이스케이프 문자를 사용해야한다. $[ ]를 사용하면 가독성이 좋다.
echo $[ 값 연산자 값 ]

셸 설정 파일, 디렉터리


  • /etc/profile : 모든 사용자에 적용되는 환경 변수와 시작 관련 프로그램 설정
  • ~/.bash_profile : 개인 사용자에 적용되는
  • /etc/bashrc : 모든 사용자에 적용되는 alias와 함수 설정
  • ~/.bashrc : 개인 사용자에 적용되는
  • ~/.bash_logout : 개인 사용자가 로그아웃 할 때 수행되는것 설정
  • /etc/profile.d/ : 응용 프로그램에서 시작할때 설정을 위한 스크립트가 위치하는 디렉터리

 

반응형
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,
반응형

/etc/sysconfig/network

네트워크 사용 유무 지정, 호스트명, NIS도메인명, 게이트웨이 주소, 게이트웨이 장치 파일 설정 등이 기록되는 파일

게이트웨이 주소는 이더넷 디바이스 파일 ifcig-eth0에 기록되는 경우도 있다.

 

/etc/sysconfig/network-scripts

네트워크 인터페이스 환경 설정과 관련된 파일들이 저장되는곳으로 각 디바이스 별 파일명으로 저장된다.

 

/etc/resolv.conf

시스템 DNS 서버 설정

 

/etc/hosts

IP 주소와 호스트명을 매핑시키는 파일로 Alias 설정하여 가상 도메인 설정하는 등에 이용


 

반응형
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,
반응형

#기본명령어 ( sudo는 사용자가 판단한다 )


ps [옵션] 

-a(all processes) 프로세스 현황 표시(다른유저)

-u(user)           유저지향적(top 포맷)

-x                  터미널 제어 없이 프로세스 현황 보기

-e(all processes) 현재 system내에서 실행중인 모든 프로세스 정보를 출력

-f(full listing) (uid,pid,ppid,c stime,tty,time,cmd)

 

jobs

현재 백그라운드 실행중인 프로세스 보기

 

실행명령어 &

백그라운드에서 실행하기 

중지 후 bg %번호

포어그라운드에서 실행중인것을 백그라운드로 이동

 

fg %번호

백그라운드에서 포어그라운드로 옮기기

백 작업 중지하기

포어로 가져온후 중지시켜야 한다.  

service 확인

service --status-all | grep +

(+ 주 처리 실행중 - 우선순위 낮음 때문에 | grep + 를 붙이면 편리하다.)

 

service 서비스이름 stop

service 종료

 

kill % 

현재 실행중인 프로세스를 죽이는 명령어


시스템 컨트롤


서비스로서 실행 된 것을 제어하는 방법 (예 : ftpd 같은 데몬)

 

systemctl status 서비스명

서비스 상태 확인

 

systemctl [start, stop, restart] 서비스명

서비스 시작, 중지, 재시작

 

 

 

덤으로 시스템 시작시 데몬처럼 시작되게 하는 방법

/etc/rc.local 에 작성한다.



반응형

'OS (Operating System) > Linux' 카테고리의 다른 글

scp, sshpass 사용법, 설치(리눅스 보안)  (0) 2020.12.07
셸 스크립트 문법  (0) 2020.09.25
리눅스 셸(Shell), 환경 변수  (1) 2020.09.25
telnet, ftp 사용법  (0) 2020.09.25
리눅스 네트워크 관련 파일  (0) 2020.09.25
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,