프로 세 스 idpid / fd
epoll 에서 만 든 fd 는:
lrwx------ 1 root root 64 Aug 20 11:04 3 -> anon_inode:[eventpoll]
이 유형의 inode 는 epoll 에서 만 든 것 입 니 다.lrwx------ 1 root root 64 Aug 20 11:04 4 -> socket:[1126425]
한 편의 글:
프로 세 스 의 / proc / $pid / fd 디 렉 터 리 에 열 린 fd 를 저장 한 것 은 잘 알려 져 있 습 니 다.물론 이 프로 세 스 가 스스로 열 린 것 이 아 닐 수도 있 습 니 다. 예 를 들 어 fork () 를 통 해 부모 프로 세 스 로부터 물 려 받 은 것 입 니 다.본 고 는 socket 과 관련 된 내용 을 중점적으로 서술 하고 있다.fd 디 렉 터 리 에서 ls - l 명령 을 사용 하여 볼 때 다음 과 같은 내용 을 볼 수 있 습 니 다.
lrwx------ 1 root root 64 Nov 21 09:44 133 -> /dev/sda1lrwx------ 1 root root 64 Nov 21 09:44 134 -> /dev/sdb1lrwx------ 1 root root 64 Nov 21 09:44 136 -> /dev/sdb1lrwx------ 1 root root 64 Nov 21 09:44 137 -> socket:[22460]lrwx------ 1 root root 64 Nov 21 09:44 138 -> socket:[7326842]lrwx------ 1 root root 64 Nov 21 09:44 139 -> socket:[7341066]
그럼 이 socket: 뒤에 있 는 숫자 는 무엇 입 니까?사실은 이 socket 의 inode 번호 입 니 다.Liux 커 널 코드 net / socket. c 에서 알 수 있 듯 이 다음 과 같 습 니 다.
/* * sockfs_dname() is called from d_path(). */static char *sockfs_dname(struct dentry *dentry, char *buffer, int buflen){return dynamic_dname(dentry, buffer, buflen, "socket:[%lu]",dentry->d_inode->i_ino);}
그렇다면 어떤 프로 세 스 가 열 린 socket 의 inode 번 호 를 알 게 되면 우 리 는 무엇 을 할 수 있 습 니까?이것 은 / proc / net / tcp (udp 대응 / proc / net / udp) 파일 과 관련 이 있 습 니 다. 그 중에서 도 해당 socket 의 inode 번 호 는 이 필드 를 통 해 / proc / net / tcp 에서 이 인터페이스의 다른 정 보 를 얻 을 수 있 습 니 다. 예 를 들 어 대응 하 는 쌍, 창 크기, 상태 등 입 니 다.구체 적 인 필드 의 미 는 net / ipv 4 / tcp 참조ipv 4. c 의 tcp4_seq_show 함수.cat / proc / net / tcp 는 다음 과 같 습 니 다.
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
19: 0100007F:83B8 0100007F:A57D 01 00000000:00000000 00:00000000 00000000 0 0 10879 1 f622edc0 20 4 31 3 -1 20: 0100007F:0FA0 0100007F:AA06 01 00000000:00000000 00:00000000 00000000 0 0 7326842 1 f5504dc0 20 4 11 5 -1
주: 본 논문 에서 언급 한 코드 는 Liux 2.6.30.1 을 기준 으로 합 니 다.
다른 편:
netstat 통계 tcp 연결 수
최근 온라인 애플 리 케 이 션 에서 socket 수가 천천히 증가 하고 회수 하지 않 으 며 경고 선 을 초과 한 후 운영 모니터링 에 의 해 자동 으로 재 개 되 었 습 니 다.
먼저 zabbix 에서 JVM 기록 을 살 펴 보 니 JVM - Perm space 가 최근 2 주 동안 데이터 가 없 는 것 으로 나 타 났 다. 프로그램 이 JDK 7 에서 JDK 8 로 전 환 된 것 으로 추정 된다.개발 자 에 게 물 어 본 뒤 프로그램 이 재 개 되 지 않 은 지 오래 돼 최근 에 야 다시 발표 됐다.그 사이 온라인 자바 운영 환경 은 JDK 7 에서 JDK 8 로 업그레이드 됐다.
jdk 8 에 Perm space 가 없어 서 Metaspace 로 바 뀌 었 습 니 다.
netstat
온라인 서버 에 가서 netstat 로 프로 세 스 의 connection 수량 을 통계 합 니 다.
netstat -antp | grep pid | wc -l
zabbix 의 통계 socket 수량 보다 100 여 개가 적 고 netstat 통 계 는 100 여 개 에 불과 하 며 zabbix 의 모니터링 데 이 터 는 300 여 개 에 불과 하 다.
그래서 / proc / $pid / fd 에서 socket 형식의 fd 수량 을 통계 합 니 다:
cd /proc/$pid/fd
ls -al | grep socket | wc -l
데이터 가 zabbix 의 데이터 와 일치 하 는 것 을 발견 하 였 습 니 다.
netstat 는 어떻게 통 계 했 습 니까?
netstat 소스 코드 다운로드
http://unix.stackexchange.com/questions/21503/source-code-of-netstat
apt-get source net-tools
netstat 코드 에서 통계 정 보 를 얻 기 위해 / proc / net / tcp 의 데 이 터 를 읽 는 것 을 볼 수 있 습 니 다.
자바 와 c 버 전의 간단 한 netstat 구현
자바 버 전의
http://www.cs.earlham.edu/~jeremiah/LinuxSocket.java
C 판:
http://www.netmite.com/android/mydroid/system/core/toolbox/netstat.c
starce 로 netstat 추적 하기
strace netstat -antp
netstat 가 / proc 의 많은 데 이 터 를 읽 어 낸 것 을 발견 할 수 있 습 니 다.그래서 대체적으로 netstat 는 / proc / pid / fd 아래 의 데이터 와 / proc / net / 아래 의 데 이 터 를 모 아 통계 결 과 를 대조 한 것 임 을 알 수 있다.
어떤 socket 이 netstat 에 의 해 통계 되 지 않 습 니까?
또 인터넷 에서 찾 아 보 니 socket 이 만 들 어 졌 다 면 bid 나 connect 가 없 으 면 netstat 에 의 해 통계 되 지 않 는 다 고 합 니 다.
http://serverfault.com/questions/153983/sockets-found-by-lsof-but-not-by-netstat
실제로 socket 이 만 들 어 졌 고 사용 되 지 않 았 다 면 / proc / pid / fd 아래 에 만 있 을 뿐 / proc / net / 아래 에 관련 데이터 가 있 지 않 습 니 다.
간단하게 테스트 해 보 니 그 렇 군요.
int socket = socket(PF_INET,SOCK_STREAM,0); //
또한, socket 이 사용 되 었 더 라 도 shutdown 을 실행 한 후 처음에 netstat 로 socket 의 상 태 를 FIN 으로 집계 할 수 있 습 니 다.WAIT1。시간 이 지나 면 netstat 는 socket 의 정 보 를 통계 할 수 없 지만 / proc / pid / fd 에서 찾 을 수 있 습 니 다.
중간 에 프로그램 을 써 서 / proc / pid / fd 의 inode 와 / proc / net / 아래 의 데 이 터 를 비교 해 보 니 확실히 socket 의 inode 가 / proc / net / 아래 에 나타 나 지 않 는 다.
lsof 로 보기
lsof 로 socket inode 보기:
GC 트리거, 소켓 회수
그래서 GC 를 터치 해서 socket 이 회수 되 는 지 확인 하 십시오.
jmap -histo:live
결국 socket 이 모두 회수 되 었 다.
AbstractPlain Socketml 의 finalize 방법 을 살 펴 보 겠 습 니 다.
/**
* Cleans up if the user forgets to close it.
*/
protected void finalize() throws IOException { close(); }
socket 은 GC 에서 닫 히 는 것 을 볼 수 있 습 니 다. 테스트 할 프로그램 을 작성 하 십시오:
public class TestServer {
public static void main(String[] args) throws IOException, InterruptedException { for(int i = 0; i < 10; ++i){ ServerSocket socket = new ServerSocket(i + 10000); System.err.println(socket); } System.in.read(); } }
먼저 실행, 보기 / proc / pid / fd, 관련 socket fd 를 발견 하고 GC 를 터치 하면 socket 이 회수 되 었 음 을 발견 할 수 있 습 니 다.
다른
anon_inode:[eventpoll]
ls -al /proc/pid/fd
이러한 출력 이 있 음 을 볼 수 있 습 니 다:
661 -> anon_inode:[eventpoll]
이 유형의 inode 는 epoll 에서 만 든 것 입 니 다.
좀 더 멀리, Liux 에서 자바 의 selector 실현 은 epoll 과 하나의 pipe 를 결합 하여 이벤트 알림 기능 을 실현 합 니 다.그래서 NIO 프로그램 에 anon 이 있 을 거 예요.inode: [eventpol] 과 pipe 형식의 fd.
왜 tail - f / proc / $pid / fd / 1 은 stdout 의 데 이 터 를 읽 을 수 없 습 니까?
http://unix.stackexchange.com/questions/152773/why-cant-i-tail-f-proc-pid-fd-1
총결산
jdk 업그레이드 이후 GC 의 작업 방식 이 바 뀌 었 고, FullGC 가 실행 하 는 시간 이 길 어 지면 서 남 은 socket 이 회수 되 지 않 았 기 때 문 입 니 다.
본 고 는 비교적 어 지 러 워 서 몇 가지 도구 와 기 교 를 기록 하 였 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
linux2에 nginx 설치설치 가능한 nginx를 확인하고, 해당 nginx를 설치한다. localhost 혹은 해당 ip로 접속을 하면 nginx 화면을 볼 수 있다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.