리눅스 커널 값들 정리


# 리눅스 커널 튜닝 ### 명령어 조회 ```sh sysctl -a ``` ### 커널 파라미터 변경 ```sh sysctl -w fs.file-max=100000 ``` file-max 란 파일 디스크립터의 최대 개수를 설정하는 파라미터이다. 파일 디스크립터는 파일, 소켓, 파이프 등 다양한 I/O 자원에 대해 사용됨 ```sh ulimit -n ``` 영구적으로 설정
echo "fs.file-max=100000" >> /etc/sysctl.conf
sysctl -p
--- ### 커널 파라미터 ## fs.file-max * 네트워크 소켓도 파일. * 값이 너무 작으면 fd 부족으로 오류 날 수 있음 * 적정 값 : 메모리(kb) 10% * 설정 후 재부팅 필요 * 유저별 설정 (ulimit -a 의 openfiles) * `ulimit -SHn 65535` * `/etc/security/limits.conf` 파일 설정 (영구) * soft nofile 65535 * hard nofile 65535 * 아스타 시 모든 사용자. 별도 사용자 지정해서 설정도 가능 * 프로세스별 설정 (fs.nr\_open) * 하나의 프로세스가 열수 있는 최대 파일 수 * fs.file-max의 1/3을 초과해서는 안됨 * 유저별 openfiles의 설정값은 이 값을 넘으면 안됨 ## net.core.somaxconn * client의 연결 요청이 accept 되기전 쌓이게 되는 Queue의 사이즈 * 너무 작으면 누락될 수 있음 * `default` : 128 (v5.4부터는 4096이 디폴트) ## net.ipv4.tcp_max_syn_backlog * TCP 의 three way hand shaking 시 서버가 SYN 을 받으면 상태를 SYN\_RECV 로 변경하며 queue 에 저장. * 큐의 크기가 너무 작으면 Syn flooding 공격에 취약. 또는 client가 동시에 연결 시도할 경우 문제 ## net.ipv4.tcp_window_scaling * 대역폭을 높이기 위해선 RTT(물리 거리) 낮추거나 receiver window size를 키우거나 * tcp 헤더의 옵션 필드에 window scale이라는 필드를 정의하여 advertise할 수 있는 receiver window size의 한계치를 키울 수 있도록 하는 설정 * 통신하는 양쪽 모두 설정되어 있어야 올바르게 작동 * 아무리 커지더라도 서버 소켓 버퍼 크기 보다 커질 수는 없음 → 소켓당 버퍼 크기 증가 필요 ## net.ipv4.tcp_syncookies * 시스템 리소스 공격 방어 * 원래는 syn+ack 보내기 전에 연결을 생성해서 SYN backlog에 저장 * 해당 설정 활성화(1)하면 클라이언트로부터 ack 신호를 받은 후 연결 생성 * 정상적이지 못한 경우 SYN backlog 큐에 패킷 쌓이는 경우 방지 ## net.ipv4.tcp_timestamps * TCP는 sequence 값으로 패킷 순서 판별. 그러나 데이터 수신하는 시스템이 네트워크 보다 처리속도가 느린 경우 시퀀스의 중복이 발생할 수 있음(int overflow 등) → wrapped sequence number 문제 * 설정 시 패킷을 받았을 대 timestamp 기록해둠. sequence 가 중첩 되더라도 timestamp로 판별 ## net.ipv4.tcp_synack_retries * `default` : 5 * 별도 설정 없이 ack 신호를 받지 못하면 총 5번 synack 을 보내게 되고 총 63초 후(1,3, 7, 15, 31)에 timeout 발생 * 요청 많은 경우 SYN backlog 가 가득차는 문제 발생할 수 있음 ## net.ipv4.tcp_tw_reuse * 사용가능한 상태의(TIME\_WAIT 된지1초 이후) TIME-WAIT 소켓을 재사용하도록 설정 * 사용하려면 timestamp 옵션도 활성화되어있어야함 ## net.ipv4.tcp_mem (rmem/wmem) * tcp 버퍼 크기 (총 / 수신 / 송신) * 크게 설정할수록 (시스템 메모리 - 대역폭 trade off) * r/wmem과는 다르게 **`net.ipv4.tcp_mem`** 의 경우 부팅 시 최적의 값으로 자동으로 설정됨. → 가능하면 수정하지 말것. * tcp 소켓 버퍼의 총량이 해당 값의 pressure를 넘어가게 되면 (TCP memory pressure 상태) 모든 소켓들은 min에 해당하는 크기를 가지게됨 * 이 설정 값의 단위는 1바이트가 아닌 1페이지(4096바이트)
되돌아가기 수정