레이블이 socket인 게시물을 표시합니다. 모든 게시물 표시
레이블이 socket인 게시물을 표시합니다. 모든 게시물 표시

네트워크 관련 sysctl

# 연결 지향 tcp 는 데이터를 주고 받기전 우선 연결된다.
# 리슨을 위해 바인딩된 포트 열어 놓는 쪽은 passive open으로 서버가 되고,
# 연결을 요청하는 쪽은 active open으로 클라가 된다.
# tcp 종료 과정은 다음과 같다.
# 그림 출처 : 위키피디아 https://en.wikipedia.org/wiki/Transmission_Control_Protocol


# sysctl 은 런타임시에 커널의 파리미터를 설정하는 명령어다.
# /etc/sysctl.conf 파일로도 설정할 수 있다.
# /proc/sys/net/ipv4 에 파일 수정으로 설정할 수 있다.
https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
http://lxr.linux.no/linux+v3.2.8/Documentation/networking/ip-sysctl.txt
# 이중 net.ipv4 로 시작하는 tcp 제어 설정에서 중요한 몇개를 살펴 보자.

# 로컬 포트가 고갈되는 경우
# TIME_WAIT(fin을 받고 서버에 ack 보내고 일정 시간 기다리는 상태)의 소켓들을 재사용할지 여부
# 0 : 비활성화
# 1 : 활성화 (보통 1로 사용)
# 2 : loopback 에서만 활성화
net.ipv4.tcp_tw_reuse = 1

# FIN_WAIT_2(서버쪽 close 중임을 클라에게 알리는 ack 를 받았을때의 클라 상태)이후
# last_ack 를 받지 못했을때 대기시간으로 디폴트 60초이다.
# 참고로 TIME_WAIT 의 타임아웃은 커널소스에 60초로 하드 코딩되어 있다.
# /usr/src/kernels/3.10.0-957.1.3.el7.x86_64.debug/include/net/tcp.h
# #define TCP_TIMEWAIT_LEN (60*HZ)
net.ipv4.tcp_fin_timeout = 60

# 로컬 포트 사용(허용) 범위
net.ipv4.ip_local_port_range = 23768 60999

# tcp_tw_use 처럼 TIME_WAIT 상태의 소켓을 재사용(recycle)할지 여부
# 디폴트는 비활성화
# 여러 문제가 발생될 소지가 있어 최근 리눅스 4.12 에서는 제거되었다고 한다.
https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux
net.ipv4.tcp_tw_recycle = 0

close_wait 문제

TCP 의 close_wait 상태가 서버쪽에서만 있는 줄 알았는데 클라이언트(클라)에서도 close_wait 상태가 발생하였다. 운영중인 서비스의 서버가 클라입장이 되어 다른 서버로 요청을 하고 있었는데 다수의 close_wait 발생으로 소켓을 리소스가 점점 고갈되는 현상을 경험했다.

# 정상적인 세션 닫기(종료) 처리
1. 세션 종료를 위해 클라이언트가 서버로 FIN 패킷을 보내고 서버에서는 닫기처리를 수행한다. 이때가 서버는 close_wait 상태가 된다.
2. 서버에서 닫기 작업이 완료되면 클라이언트에 닫기 완료 패킷을 보내게 되고 클라쪽에서 정상적인 세션 종료 처리가 이뤄진다.

그런데 서버쪽에서 먼저 클라에게 종료 패킷을 보내게 되는 경우가 클라는 close_wait 상태가 된다. 서버는 세션 종료가 끝나 상태인데, 클라쪽에서는 세션 종료를 위해 FIN 패킷을 서버로 보내고 응답을 계속 기다리게 된다. 하지만 서버에서 응답을 받지 못해 계속 close_wait 로 남아 있게 된다.

결국 클라이언트 입장에서 close_wait 로 빠지는 세션들에 대해서 확실한 종료 처리 과정이 있어야 한다.
막연히 생각나는 방법으로 close_wait 상태에서 일정 시간이 지나면 강제로 세션 정리를 한다던지... 좀더 고민이 필요한 부분이다.

참고



MySQL ERROR 2002 (HY000)

# mysql (클라이언트)을 실행했을때 다음과 같은 에러가 발생했다.
# mac 의 경우 /tmp/mysql.sock
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

# [해결방법]
# mysql (데몬)을 실행시키면 /var/lib/mysql/mysql.sock 파일이 생성되며, mysql 데몬을 죽이면 사라지게 된다.
sudo /sbin/service mysqld start

# mac brew 서비스라면 다음과 같이 실행하면 /tmp/mysql.sock 파일이 생성된다.
brew services start mysql

# 참고, mac arm64 환경에서의 my.cnf 파일 위치
vi /opt/homebrew/etc/my.cnf
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1

# 참고, mysql 을 실행시 sock 파일을 명시
mysql --socket=/var/lib/mysql/mysql.sock -h localhost -P 3306 -u root -ptest123

#####

# 다음과 같이 localhost 를 사용해도 에러가 발생한다.
mysql -h localhost -P 3306 -u root
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

# [해결방법]
# localhost -> 127.0.0.1 을 사용하면 된다.
mysql -h 127.0.0.1 -P 3306 -u root -ptest123

Android Java.net.SocketException : Permission denied 처리 하기

아래의 메시지는 안드로이드 개발환경(AndroidManifest.xml)에 인터넷 사용 허용 설정을 하지 않아서 나타난다.
Java.net.SocketException : Permission denied

이를 해결하기 위해서 AndroidManifest.xml 에 다음을 추가한다.
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

또는 이클립스에서 AndroidManifest.xml -> permissions -> Add -> Uses permission 후 Name 에 android.permission.INTERNET 를 쓰면 위 문장이 AndroidManifest.xml 에 추가 된다. (아래 그림 참고)




Linux 시스템 다양한 정보 보기, 성능 분석

# 시스템 정보 보기 (호스트네임,커널,프로세서,OS,..etc)
uname -a

# linux 이름 및 버전 정보 보기
vi /etc/issue

# 또는
cat /etc/*-release

# 사용자 리스트
vi /etc/passwd

# CPU 정보
vi /proc/cpuinfo

# memory 정보
vi /proc/meminfo

# 또는
# -m MB 로 표시, -g GB 로 표시,...etc
free -m

# 또는
# virtual memory 상태 -w wide
vmstat -w

# 또는
# -s status -S m MB 로 표시
vmstat -s -S m

# vmstat,mpstat,sar 설치
yum install sysstat

# memory 사용률 1초마다 갱신해서 5번까지 보기
vmstat 1 5

# 시스템 성능 통계
# cpu 사용률 1초마다 갱신해서 5번까지 보기
sar 1 5

# process 사용률 1초마다 갱신해서 5번까지 보기
mpstat 1 5

# Disk 별 uuid 정보
ls -ahl /dev/disk/by-uuid/

# Disk 사용량 보기
df -h

# 부팅 후 운용시간 보기
uptime

# dns 서버 설정
vi /etc/resolv.conf

# host 커스텀 설정
vi /etc/hosts

# hostname 보기
cat /proc/sys/kernel/hostname

# 시스템 정보
sudo dmidecode -t system

# 메모리 정보
sudo dmidecode -t memory

# 바이오스 정보
sudo dmidecode -t bios

# 소켓 간단한 상태 보기
cat /proc/net/sockstat

# 소케 메모리 사용량 확인
netstat -m

# 소켓 사용 현황 보기
# -n(numberic ip 로 표현, 도메인 리졸브 안함)
# -a(all)
# -t(tcp)
netstat -nat

# 또는
ss -nat

# 도메인 ip 보기
nslookup google.com

# 또는(좀더 자세하다.)
dig google.com

# 패킷 라우팅 보기
traceroute google.com

# 포트 범위
sysctl net.ipv4.ip_local_port_range

# 또는
cat /proc/sys/net/ipv4/ip_local_port_range

# tcp 관련 설정 정보
sysctl -a | grep net.ipv4.tcp

# 프로세스가 사용하는 시스템 콜 api 보기
sudo yum install strace
strace 명령어

# 예) ls 명령에서 open 시스템 콜만 골라 보기
strace -e trace=open ls

# 예) 실행중인 프레스 attach 해서, 결과 파일로 쓰기
strace -p 프로세스id -o zzz.strace

# 열린 파일 리스트
sudo yum install lsof
lsof

# 1234 포트 사용중인 파일 리스트
# 해당 PID 를 파악할 수 있다.
lsof -i :1234

# rsync 커맨드가 사용중인 파일 리스트
lsof -c rsync

# io 트랙픽 보기
sudo yum install iotop
sudo iotop

# network 트래픽 보기
# -i  eth0 으로 특정 네트워크 인터페이스를 지정할 수 있다.
sudo yum install iftop
iftop

# 시스템 부팅 시 메시지
dmesg -e

# 에러, startup, shutdown 등의 각종 시스템 이벤트 로그
sudo vi /var/log/messages


#####


# mac 참고
# 모든 정보
sysctl -a

# cpu 브랜드 이름
sysctl -a | grep cpu.brand_string

# cpu 개수
sysctl -n hw.ncpu

# 메모리 크기
sysctl -n hw.memsize

# 메모리 사용량 1초마다 보기
vm_stat  1

# 컴퓨터 이름 보기
networksetup -getcomputername

# 컴퓨터 이름 설정
networksetup -setcomputername "ysoftman macbook pro"

# 사용 가능한 네트워크 종류 보기
networksetup -listallnetworkservices

# 연결중인 네트워크 리스트
networksetup -listallhardwareports

# wi-fi(listallnetworkservices 중하나) 정보
networksetup -getinfo wi-fi

# en0(보통 wi-fi) 끄기
networksetup -setairportpower en0 off

# en0(보통 wi-fi) 켜기
networksetup -setairportpower en0 on

# airport(wi-fi) 상태 정보
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I

# 시스템 자세한 정보
system_profiler

# 시스템 자세한 정보(app)
spotlight -> 시스템 정보.app(또는 system profiler 로 실행)

# 시스템 메시지(로그)
# mac 에선 dmesg 로 부팅 로그 전체를 볼 수 없어 log 를 사용하는것이 좋다.
# log 는 dmesg 를 포함한 시스템 로그를 취합해 보여준다.
# start 날짜 이후의 시스템 메시지
log show --start "2010-02-19"

# 실시간 시스템 로그 보기
log stream

# 로그 전체 삭제
sudo log erase --all

# 시스템 로그 파일
vi /var/log/system.log

# 참고 리눅스에서 상황/대상별에 맞는 분석/성능 툴
http://www.joyent.com/blog/linux-performance-analysis-and-tools-brendan-gregg-s-talk-at-scale-11x