PTY: 프로세스에게 터미널처럼 보이는 커널 객체
PTY exhaustion: 시스템이 프로세스에게 새 pseudo-terminal(가상 터미널)을 할당하려고 했지만 커널이 관리하는 PTY 리소스의 한도에 도달하여 더 이상 만들 수 없는 상태
구조
Terminal-like program
│
│ PTY master
▼
┌───────────┐
│ Kernel │
└───────────┘
▲
│ PTY slave
│
/dev/pts/N
│
▼
shell
일반적인 물리 터미널 대신, 소프트웨어가 터미널처럼 동작해야 할 때 PTY를 사용한다. 예를 들어 ssh, tmux, screen, 터미널 에뮬레이터, Docker의 -t, Kubernetes의 kubectl exec -it, IDE terminal 등이 이에 해당한다.
1. PTY가 정확히 무엇인가
PTY는 master/slave 쌍으로 이루어진 가상 터미널 장치다.
예를 들어 사용자가 SSH로 서버에 접속해서 shell을 띄우면 대략 다음과 같이 동작한다.
사용자 키보드
│
▼
SSH client
│ network
▼
sshd
│
▼
PTY master <──── kernel ────> PTY slave
/dev/pts/4
│
▼
bash
bash 입장에서는 /dev/pts/4가 실제 터미널처럼 보인다.
그래서 다음과 같은 터미널 기능이 가능해진다.
Ctrl+C
Ctrl+Z
job control
terminal resize
echo
canonical input
foreground/background process group
반대로 SSH에서 PTY를 할당하지 않으면 단순 pipe 기반 stdin/stdout처럼 동작할 수 있다.
~$ ssh host command 는 경우에 따라 PTY가 필요하지 않지만, ~$ ssh -t host는 명시적으로 PTY를 요청한다.
2. Linux에서 PTY는 어디에 존재하는가
현대 Linux에서는 보통 Unix98 PTY를 사용한다.
slave 측은 다음과 같이 보인다. /dev/pts/0 /dev/pts/1 ...
현재 터미널을 확인하려면 ~$ tty
PTY 관련 커널 상태는 다음에서 확인할 수 있다.
#현재 할당 되어 있는 PTY 개수
cat /proc/sys/kernel/pty/nr
#시스템 전체에서 허용되는 PTY 최대 개수
cat /proc/sys/kernel/pty/max
3. "PTY 고갈"이 실제로 무엇을 의미하는가
새로운 SSH connection이 들어오면서 sshd가 PTY를 달라고 커널에 요청한다. 이미 한계에 도달했을 경우 openpty() 또는 /dev/ptmx를 통한 PTY allocation이 실패한다.
다음과 같은 에러가 나올 수 있다.
openpty: No space left on device (디스크 공간 부족을 의미하는게 아니다)
4. 정상적인 PTY lifecycle
정상적으로는 다음처럼 동작한다.
1. process가 PTY 요청
2. kernel이 PTY master/slave pair 생성
3. /dev/pts/N 생성
4. shell/process가 slave 사용
5. 세션 종료
6. master/slave FD close
7. kernel이 PTY 회수
SSH 접속
↓
PTY 123 생성
↓
bash 실행
↓
사용자 logout
↓
FD close
↓
PTY 123 해제
5. PTY가 고갈되는 대표적인 원인
중요한 건 PTY 자체가 일반적으로 "영구적으로 leak"되는 게 아니라, PTY를 열어 둔 프로세스가 계속 살아 있기 때문에 회수되지 않는 경우가 많다는 점이다.
원인 1: SSH session 폭증
원인 2: orphaned 또는 오래 살아 있는 shell
원인 3: tmux/screen session 과다
원인 4: Container에서 TTY 대량 할당
원인 5: 테스트/자동화 코드의 PTY leak
6. PTY namespace/container와 관련한 주의점
Linux container 환경에서는 /dev/pts가 별도의 devpts mount로 보일 수 있다.
그래서 컨테이너 안에서 보이는 /dev/pts 상태와 host 전체 커널의 PTY 상태를 구분해서 봐야 한다.
Linux kernel이 PTY를 관리하는 방식에는 전역 limit뿐 아니라 devpts namespace와 관련된 설정도 있어, container 환경에서는 host에서 확인하는 것이 더 정확한 경우가 많다.
특히 비교적 현대적인 kernel에서는:
cat /proc/sys/kernel/pty/max
cat /proc/sys/kernel/pty/reserve
cat /proc/sys/kernel/pty/nr
같은 항목이 존재할 수 있다.
pty.reserve는 특정 상황에서 initial mount namespace에 PTY 여유분을 예약하기 위한 개념이다.
'Linux(Ubuntu) > 서버 원격접속' 카테고리의 다른 글
| XRDP Linux to Linux (0) | 2026.04.06 |
|---|---|
| tailscale 명령어 (0) | 2026.04.03 |
| CSP Bastion Service 모음 (0) | 2026.03.14 |
| Apache Guacamole (0) | 2026.03.14 |
| Azure Bastion (0) | 2026.03.14 |