리눅스 커널은 리눅스 운영체제의 주요 구성 요소이자 컴퓨터 하드웨어와 프로세스를 잇는 핵심 인터페이스.
커널의 기능
메모리 관리 : 메모리가 어디에서 무엇을 저장하는 데 얼마나 사용되는지를 추적한다.
프로세스 관리 : 어느 프로세스가 중앙 처리 장치(CPU)를 언제 얼마나 오랫동안 사용할지를 결정한다.
장치 드라이버 : 하드웨어와 프로세스 사이에서 중재자/인터프리터의 역할을 수행한다.
시스템 호출 및 보안 : 프로세스의 서비스 요청을 수신합니다.
2. 커널 파라미터란?
리눅스에서 사용되는 시스템 변수들을 의미하며, 커널 변수 값을 제어하여 시스템을 운영 용도에 맞게 최적화 할 수 있는 설정. 커널 매개변수 경로는 /proc/sys 디렉토리 밑에 존재하고 커널 파라미터의 절대 경로의 수정을 통해 설정 변경이 가능하지만 sysctl을 통해 간편하게 설정할 수 있다.
# oracle-database-preinstall-19c setting for fs.file-max is 6815744
fs.file-max = 6815744
# oracle-database-preinstall-19c setting for kernel.sem is '250 32000 100 128'
kernel.sem = 250 32000 100 128
# oracle-database-preinstall-19c setting for kernel.shmmni is 4096
kernel.shmmni = 4096
# oracle-database-preinstall-19c setting for kernel.shmall is 1073741824 on x86_64
kernel.shmall = 1073741824
# oracle-database-preinstall-19c setting for kernel.shmmax is 4398046511104 on x86_64
kernel.shmmax = 4398046511104
# oracle-database-preinstall-19c setting for kernel.panic_on_oops is 1 per Orabug 19212317
kernel.panic_on_oops = 1
# oracle-database-preinstall-19c setting for net.core.rmem_default is 262144
net.core.rmem_default = 262144
# oracle-database-preinstall-19c setting for net.core.rmem_max is 4194304
net.core.rmem_max = 4194304
# oracle-database-preinstall-19c setting for net.core.wmem_default is 262144
net.core.wmem_default = 262144
# oracle-database-preinstall-19c setting for net.core.wmem_max is 1048576
net.core.wmem_max = 1048576
# oracle-database-preinstall-19c setting for net.ipv4.conf.all.rp_filter is 2
net.ipv4.conf.all.rp_filter = 2
# oracle-database-preinstall-19c setting for net.ipv4.conf.default.rp_filter is 2
net.ipv4.conf.default.rp_filter = 2
# oracle-database-preinstall-19c setting for fs.aio-max-nr is 1048576
fs.aio-max-nr = 1048576
# oracle-database-preinstall-19c setting for net.ipv4.ip_local_port_range is 9000 65500
net.ipv4.ip_local_port_range = 9000 65500
fs.file-max : 시스템에서 동시에 오픈 가능한 파일의 수와 연관된 파일 핸들의 최대값
kernel.sem
semmsl: 세마포어 세트당 세마포어의 최대 개수
semmns: 시스템 전체에 대한 세마포어의 최대 개수
semopm: 시스템 호출(call)별로 수행될 수 있는 세마포어 작업의 수
semmni: 시스템 전체에 대한 세마포어 세트의 최대 개수
세마포어(semaphore): 오라클 백그라운드 프로세스들 간동시성(Concurrency)을 조절하기 위해 사용
kernel.shmmni : 공유 메모리 세그먼트의 최대 개수
kernel.shmall : 특정 시점에 시스템에서 사용 가능한 공유 메모리의 최대 크기
kernel.shmmax : 공유 메모리 세그먼트의 최대 크기
커널이 응용프로그램들에게 메모리를 할당해줄 때 작게 여러 번 할당하지 않고큰 덩어리(=세그먼트)로 한꺼번에 주게되는데 이값이너무 작으면DB가 시작할 때ORA-27123 : unable to attach to shared memory segment라는 메시지가 발생할 수 있고너무 크면세그먼트의 사용되지 않는 빈 공간을 두기 때문에메모리 낭비가 발생함.
이 값의 기본 값은32MB. 오라클 사용 시에는2G로 설정하도록 권장.
kernel.panic_on_oops : 버그가 발생하면 시스템 PANIC 상태로 처리할지를 결정
net.core.rmem_default : TCP 수신 버퍼 크기의 기본값 설정
net.core.rmem_max : TCP 수신 버퍼 크기의 최대값 설정
net.core.wmem_default : TCP 송신 버퍼 크기의 기본값 설정
net.core.wmem_max : TCP 송신 버퍼 크기의 최대값 설정
net.ipv4.conf.default.rp_filter : 모든 인터페이스에서 들어오는 패킷에 대해 reply를 하여 들어오는 인터페이스로 나가지 못하는 패킷을 거부함
fs.aio-max-nr : 동시에 들어오는 요청의 개수를 제한함
net.ipv4.ip_local_port_range : 시스템에 접속할 때 사용할 수 있는 네트워크 포트의 범위
3. 사용자 리소스 설정 (shell limit)
shell limit?
shell과 shell이 실행한 프로세스에 대하여 시스템 상의 사용 자원을 제한할 수 있도록 해주는 설정.
limit 설정 시 두가지 종류의 limit이 존재한다.
hard limit : soft limit에서 최대로 늘릴 수 있는 한도이며, 슈퍼유저(즉, root)에 의해서 조정이 가능함
soft limit : 새로운 프로세스가 생성되면 기본적으로 적용되는 제한값이다.
shell limit을 사용하는 이유
웹 서비스를 운영 할 때 동시 접속자가 많은 경우에 따라 웹 서비스 프로세스 수와 해당 프로세스가 처리하게 되는 파일 수를 조절 하기 위해
오라클과 같은 데이터베이스 같은 경우 Linux 계정마다 실행되는 프로세스와 열린 파일의 수를 제한하는 것을 권장하기 때문
설정 방법
1) ulimit 명령어와 옵션 사용
현재 설정 상황 확인
[oracle@lenovo1 ~]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 1029047
max locked memory (kbytes, -l) 134217728
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 16384
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
2) /etc/security/limits.conf 파일 수정
설정 예시 (ORACLE 19c)
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle hard memlock 134217728
oracle soft memlock 134217728
soft: 새로운 프로그램을 생성하면 기본적으로 적용되는 한도. 간간히 지키지 않아도 되는limit
top 명령어는 현재 OS의 상태를 나타내주는 CLI 어플리케이션입니다. 메모리 사용량, CPU 사용량 등을 나타내주며 top를 실행하는 동안에는 주기적인 업데이트로 실시간에 근접한 내용을 보여줍니다. 리눅스에서 top 명령어를 실행하면 아래와 깉이 노출됩니다. 위에는 전체의 요약이 있으며 아래에는 각 프로세스마다 구체적인 내용을 포함하고 있습니다.
요약 영역
요약 영역은 top에서 상단에 위치하고 있습니다. 이요약영역은 전체 프로세스가 OS에 대해서 리소스를 어느정도 차지하고 있는지를 알려줍니다. 요약 영역에 나타나는 대표적인 값은 시간, 유저, 로드 에버리지(Load Average), 테스크(Tasks), CPU, 메모리(memory)로 아래의 이미지를 보시면 각 영역에 대해 나태내느 값이 어디에 위치하는지 알 수 있습니다.
시스템 현재 시간, OS가 살아있는 시간, 유저 세션수(System time, uptime and user sessions)
이미지의 가장 왼쪽 위를 보시면 시스템 현재 시간, OS가 살아있는 시간, 그리고 유저의 세션수가 표시되는 영역이 있습니다.가장 먼저 보이는 숫자가 시스템의 현재 시간입니다. 이 시간은 GMT 기준으로 표시됩니다. 위 예제 기준으로 GMT 16:58:55 이라는 것입니다. 이것은 한국시간으로 보면 +9를 한 00시 58분 55초와 동일합니다.다음으로 표시되는 것이 OS가 얼마나 살아있는지 나타냅니다.days와 시간으로 표시되며 위 예제로보면 7일과 1시 15분 동안 서버가 살아있었다는 것을 알 수 있습니다.그리고 다음 나타나는것이 현재 접속중인 유저 세션 수입니다.
좀 더 자세한 유저세션이 궁금하다면who명령어를 통해 알 수 있습니다.
로드 애버리지(Load Average)
2번째 영역은 로드 애버리지 영역입니다. 해당 영역은CPU Load의 이동 평균를 표시합니다. 앞에서 부터 1분, 5분, 그리고 15분에 대한 평균값입니다. CPU Load란 CPU가 수행하는 작업의 양 입니다. 리눅스에서는 실행되거나 대기중인 프로세스의 평균입니다. 싱글 코어일 경우 1.0의 값이 CPU 100%를 사용하고 있다는 의미입니다. 멀티 코어라면 해당 코어수 만큼 * N을 한 값이 CPU 100%를 사용한다는 의미가 됩니다. 만약 100%를 넘어간다면 CPU에서 처리하지 못하고 대기하고 중인 프로세스가 있다고 보시면됩니다.
Tasks
2번째 줄에는 Tasks에 관한 내용이 출력됩니다.Tasks는 현재 프로세스들의 상태를 나태내주는 영역입니다. Total은 전체 프로세스, running은 running 상태인 프로세스, sleeping은 대기상태인 process, stopped는 종료된 프로세스, zombies는 좀비상태인 프로세스의 수를 나타냅니다.
프로세스는 일반적으로 IO 기반의 일(IO bound)과 CPU 기반의 일(CPU-bound)을 번갈아 가면서 수행하게 됩니다. 이러한 프로세스의 상태는 일반적으로 아래와 같습니다. IO 기반의 일을 하게 될 때는 CPU는 idle 타임(프로세스가 잠을 자는 상태)에 들어가게 됩니다. 또한 프로세스 스케줄링 알고리즘에 의해 프로세스는 번갈아가면서 실행되게 됩니다. 이렇게 멀티테스킹 작업을 시도하는데 이때 프로세스에는 아래와 같은 상태의 변동이 있습니다.
실행(Runnable) - CPU에 의해서 명령어가 실행중인 Process
준비(Ready) - CPU의 명령어 실행을 기다리는 Process
대기(Waiting) - I/O operation이 끝나기를 기다리는 Process
종료(Terminated) - Ctrl + Z 등의 signal로 종료된 Process
Zombie - Process는 root Process로 부터 뿌리내린 자식 Process의 형식으로 트리구조를 형성합니다. 이 때 부모가 먼저 종료된 다면 root process로 부터 닿을 수 없는 Process가 생깁니다. 이를 zombie process라고 부릅니다.
CPU 사용량
Tasks 아래 %Cpu(s)라는 영역이 있습니다.이 영역은 CPU가 어떻게 사용되고 있는지 그 사용율을 보여주는 영역입니다. 모든 값의 총 합은 100% 이며 이를 퍼센테이지로 나누어서 보여줍니다. 각 요소는 아래와 같습니다.
us : 프로세스의 유저 영역에서의 CPU 사용률
sy : 프로세스의 커널 영역에서의 CPU 사용률
ni : 프로세스의 우선순위(priority) 설정에 사용하는 CPU 사용률
id : 사용하고 있지 않는 비율
wa : IO가 완료될때까지 기다리고 있는 CPU 비율
hi : 하드웨어 인터럽트에 사용되는 CPU 사용률
si : 소프트웨어 인터럽트에 사용되는 CPU 사용률
st : CPU를 VM에서 사용하여 대기하는 CPU 비율
메모리 사용량
%Cpu(s) 영역 아래에 메모리와 관련된 영역이 있습니다. 첫번째 줄은 RAM의 메모리 영역으로 Mem이라 표시되어있는 부분입니다. 그리고 아랫줄은 디스크를 메모리 처럼 이용하는 Swap 메모리 영역입니다. 일반적으로 Mem의 사용량이 거의 가득 찼을때 Swap 메모리 영역을 사용합니다. 이 영역은 디스크이기 때문에 RAM 메모리보다 속도가 많이 느린 단점을 가집니다.
total : 총 메모리 양
free : 사용가능한 메모리 양
used : 사용중인 메모리 양
buff/cache에서buff는 buffers의 약자입니다. 이 값은 커널 버퍼에서 사용되는 메모리를 뜻합니다.cache는 Disk의 페이지 캐시를 말합니다. 즉,buff/cache는 IO와 관련되어 사용되는 버퍼에 사용되는 메모리를 말합니다. 이 메모리가 있으므로써 IO에 상대적으로 빠른 속도를 가질 수 있습니다. avail Mem은 swap 메모리를 사용하지 않고 사용할 수 있는 메모리의 크기를 말합니다.
디테일 영역
지금부터는 top 명령어의 디테일 영역에 대해서 알아보도록 하겠습니다. 디테일 영역에는 각 프로세스에 대한 상세한 내용이 나옵니다. 위 예제에서는 아래의 이미지 부분이 디테일 부분입니다. 각 요소에 대해서 하나씩 보도록하겠습니다.
PID
PID는 프로세스 ID이며 프로세스를 구분하기 위한 겹치지않는 고유한 값입니다.
USER
해당 프로세스를 실행한 USER 이름 또는 효과를 받는 USER의 이름입니다.
PR & NI
PR : 커널에 의해서 스케줄링되는 우선순위입니다.
NI : PR에 영향을 주는 nice라는 값입니다.
VIRT, RES, SHR, %MEM
해당 필드들은 프로세스의 메모리와 관련있습니다.
VIRT : 프로세스가 소비하고 있는 총 메모리입니다. 프로그램이 실행중인 코드, heap, stack과 같은 메모리, IO buffer 메모리를 포함합니다.
RES : RAM에서 사용중인 메모리의 크기를 나타냅니다.
SHR : 다른 프로세스와의 공유메모리(Shared Memory)를 나타냅니다.
%MEM : RAM에서 RES가 차지하는 비율을 나타냅니다.
S : 프로세스의 현재 상태를 나타냅니다.
TIME+ : 프로세스가 사용한 토탈 CPU 시간
COMMAND : 해당 프로세스를 실행한 커맨드를 나타냅니다.
유명한 top용 커맨드
k - kill process
top를 통해 프로세스를 모니터링하며 프로세스를 종료해야겠다고 생각할 수 있습니다. 이때 top에서는 top화면을 보며 프로세스를 종료할 수 있는 기능을 제공해주고 있습니다. 해당 기능을 사용하기 위한 커맨드는k입니다.
Sorting the process list
디테일 영역에 대해서 원하는 값을 기준으로 정렬하는 방법을 제공합니다. 제공하는 커맨드는 아래와 같습니다. 또한 이미지는 메모리 사용량을 기준으로 정렬한 값입니다.ㅖㅡㅡㅖㅖㅖㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅌ
‘M’ to sort by memory usage
‘P’ to sort by CPU usage
‘N’ to sort by process ID
‘T’ to sort by the running time
‘R’ to sort by 오름차순과 내림차순을 토글 변경합니다.
Showing a list of threads instead of processes
top는 기본적으로 프로세스를 기본으로하여 정보를 보여줍니다. 하지만H를 누르면 쓰레드(thread)를 기준으로 보여주는 방식으로 변경됩니다. 변경되는 부분은 요약의 Tasks 영역과 디테일 영역입니다.
Filtering through processes
프로세스가 너무 많다면 필터링 기능또한 제공해주고 있습니다. 해당 기능을 사용하기 위해서는 o 또는 O를 누르시면 됩니다. 필터는 COMMAND, %CPU 등등 다양한 방법으로 가능합니다.
커널은 블록디바이스(디스크)로부터 데이터를 읽거나 사용자의 데이터를 디스크에 저장한다. 하지만 디스크는 다른 장치에 비해 매우 느리기 때문에 디스크에 요청을 기다리는 시간이 상당히 많이 소요되고, 이로 인해 시스템에 부하가 발생하게 된다.
한번 읽은 디스크의 내용을 메모리에 저장해 두어서 동일한 내용을 읽고자 하면 디스크로 요청하지 않고 메모리에 저장해 두어서, 동일한 내용을 일고자 한다면 디스크로 요청하지 않고 메모리오 요청하게 되는데 이런기능을 캐싱기능이라고 한다
이때 사용되는 캐싱영역을 buffers, cached라고 부른는데 이 차이점을 알아보고자 한다.
Page Cache는 bio 구조체를 만들고 해당 구조체에 디스크로부터 받은 일반적인 데이터를 저장하게 되고 Buffer Cache는 일반적인 데이터가 아닌 _get_blk()와 같은 내부 함수를 통해 데이터가 아닌 super block, inode block 데이터를 저장한다. 정리하면 Page Cache는 파일 내용을 저장하고 있는 캐쉬, Buffer Cache는 파일시스템의 메타 데이터를 담고 있는 블록을 저장한다.
서버운영 시간이 길지 않을 때는 가용영역에 있는 메모리의 사용양이 사용영역보다 많게 됩니다. 시간이 조금 지나면 시스템은 가용영역 중 일부를 , 캐쉬영역으로 사용하게 됩니다. 그러나 시간이 지날수록 application에서 사용해야 되는 사용영역이 늘어나게 되면 일부 캐쉬영역을 반환해서 사용영역으로 반환하게 된다, 이렇게 지나고 캐쉬영역이 사용할 메모리 공간이 없어지게 되면 시스템 swap 영역을 사용하게 되고 그 순간부터 시스템 성능이 줄어들게 됩니다. 이처럼 buffers와 cached는 시스템의 I/O 성능 향상을 위해서 커널이 사용하는 영역입니다.
SwapCached: SwapCached는 SWAP으로 빠진 영역 중 다시 메모리로 돌아온 영역입니다. 시ㅍ스템에 메모리가 부족하면 커널은 프로세스의 주소공간 중 swap영역으로 이동시킬 수 있는 메모리를 선택해서 swap 영역으로 이동시킨다. 이 과정에서 I/O가 일어나기 때문에 성능저하가 발생한다. 그 후 메모리가 확보되어 swap영역으로 빠졌던 영역이 다시 메모리로 돌아가더라도 지우지 않고 이후에 발생할 수 있는 메모리 부족현상을 대비해서 이전에 내용을 지우지 않습니다.
Active(anon): 특정 파일 내용을 저장하고 있는 Page Cache 영역을 제외한 메모리영역을 의미 한다. 주로 프로세스들이 사용하는 메모리 영역을 지칭하며, 그중에서도 비교적 최근에 메모리영역이 참조되어 swap 영역으로 이동되지 않을 메모리 영역을 의미한다.
Inactive(anon): Active(anon)와 동일영역, 비교적 참조한지가 오래되어 swap으로 이동할 수 있는 메모리 영역
Active(file): anon과 다르게 file로 되어 있는 이 영역은 커널이 I/O 성능 향상을 위해 사용된는 영역을 의미한다. buffer와 cached가 여기에 속한다. 최근에 참조되어 swap영역으로 이동되지 않을 메모리 영역이다.
Inactive(file): Active(file)과 비슷한 용도로 사용, 비교적 참조 된지 오래되어 swap 영역으로 내려 갈 수 있는 영역이다.
Dirty: I/O 성능향상을 위해 커널이 캐시 목적으로 사용하는 영역 중 쓰기 작업 이 이루어져서 실제 블록 디바이스 드라이버에 씌어져야 할 영역을 의미한다. 커널은 기본적으로 I/O 쓰기 요청이 들어오면 바로 블록 디바이스 드라이버에 내리지 않고 일정량이 될 때까지 모았다가 지연쓰기를 한다.
slab: 메모리 영역 중 커널이 직접 사용하는 영역을 Slab 영역이라고 한다. 이 영역에는 dentry cache, inode cache등 커널이 사용하는 메모리가 포함된다.
SReclaimable: slab 영역 중 재사용 될 수 있는 영역이다. 캐시 용도로 사용되는 메모리들이 주로 여기에 포함된다. 메모리 부족현상이 일어나면 해제되어 프로세스에 할당 될 수 있는 영역이다.
SUnreclaim: slab 영역 중 재사용 될 수 없는 영역이다. 커널이 현재 사용중인 영역이며 해제해서 다른 용도로 사용할 ㅅ없다.
때문에 failover 가 일어날 당시 pgool을 통한 online recovery 가 상당히 느려지는 문제점이 발생
( 초기 basebackup 또한 상당한 시간이 걸렸다 )
-v 옵션을 주고 ssh 로 standby 서버에 로그인을 시도해보니 마지막 부분에서 시간이 많이 걸리는 것을 알 수 있었다.
[postgres@postgres-ha1 ssh]$ ssh -v postgres@192.168.126.5
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug1: Connecting to 192.168.126.5 [192.168.126.5] port 22.
debug1: Connection established.
debug1: identity file /home/postgres/.ssh/id_rsa type 1
debug1: key_load_public: No such file or directory
debug1: identity file /home/postgres/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/postgres/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/postgres/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/postgres/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/postgres/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/postgres/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/postgres/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.4
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.4
debug1: match: OpenSSH_7.4 pat OpenSSH* compat 0x04000000
debug1: Authenticating to 192.168.126.5:22 as 'postgres'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: curve25519-sha256 need=64 dh_need=64
debug1: kex: curve25519-sha256 need=64 dh_need=64
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:d2SLRQ9JOv/a9p/FzQ1NBnAVvqcKNmR3uLUQWX6IML4
debug1: Host '192.168.126.5' is known and matches the ECDSA host key.
debug1: Found key in /home/postgres/.ssh/known_hosts:1
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
...
...
구글링을 해보니 /etc/ssh/ssd_config 파일의 UseDNS 부분의 주석처리를 해제하고 no 로 바꾸어 주면 해결된다는 것을 찾았다.
이 파라미터를 on으로 설정해 놓으면 SSH 접속 시 DNS Lookup을 하여, DNS를 찾지 못하는 경우 일정시간 대기 후 타임아웃이 발생 한다. 즉, ssh 지연 원인은 DNS 설정이 되어 있지 않고, sshd_config 파일의 UseDNS 항목이 yes 또는 주석 처리되어 있을 때 발생!
visudo
agens ALL=(ALL:ALL) ALL
agens ALL=(ALL) NOPASSWD: ALL
방화벽 설정
현재 오픈된 포트 확인
[agens@localhost log]$ netstat -tulpn | grep LISTEN
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 24970/postgres
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 ::1:5432 :::* LISTEN 24970/postgres
tcp6 0 0 ::1:25 :::* LISTEN -