2011-11-17 4 views
4

썬의 JDK 1.6.0_26 및 (인 Netty와) NIO와 lsof를에 나는 anon_inode이다 파일 기술자의 수백을 참조하십시오왜 JDK NIO가 많은 anon_inode 파일 설명자를 사용합니까? 내가 사용

$ lsof -np 11225 | fgrep -w anon_inode 
java 11225 nobody 57u  0000    0,9   0  1386 anon_inode 
java 11225 nobody 61u  0000    0,9   0  1386 anon_inode 
java 11225 nobody 65u  0000    0,9   0  1386 anon_inode 
java 11225 nobody 69u  0000    0,9   0  1386 anon_inode 
java 11225 nobody 73u  0000    0,9   0  1386 anon_inode 
java 11225 nobody 77u  0000    0,9   0  1386 anon_inode 
java 11225 nobody 81u  0000    0,9   0  1386 anon_inode 
java 11225 nobody 86u  0000    0,9   0  1386 anon_inode 
java 11225 nobody 89u  0000    0,9   0  1386 anon_inode 
java 11225 nobody 93u  0000    0,9   0  1386 anon_inode 
java 11225 nobody 97u  0000    0,9   0  1386 anon_inode 
[...] 

내가 무엇을 익명에 관한 명확한 설명을 찾을 수 없습니다 inode는 리눅스 커널의 소스 트리에서 fs/anon_inodes.c을 보았는데 아마도 epoll이 그것을 사용하고있는 것처럼 보였습니다. 그러나 나는 왜 그렇게 많은 것을 가지고 있을지 모르겠습니다. 나는 복수의 "epoll 루프"와 타이머 스레드를 가지고 있지만, 내 번호가 anon_inode과 거의 같지 않습니다.

+0

일부 코드처럼 자세한 정보를 보지 않고 말하기 어렵습니다. –

+0

소켓은 각각 두 개의 파일 디스크립터를 사용합니다.이 익명의 inode는 파일 시스템에 없기 때문에 파일 디스크립터라고 가정합니다. –

+0

닫히지 않은 선택자? – EJP

답변

0

아마도 이러한 inode는 Java의 직접 ByteBuffers로 변환 될 메모리 매핑 된 "파일"과 관련되어 있습니다. 시스템 호출 mmap(2)은 일반적으로 파일 핸들을 사용하여 파일에 대해 작동합니다. 또한 실제 파일 핸들없이 메모리 매핑을 조작하는 옵션 인 MAP_ANONYMOUS을 지원합니다. 이것은 내부적으로 "익명 inode"가 필요할 수도있는 것처럼 들립니다.

5

실제로 epoll 일 가능성이 큽니다. 셀렉터는 초기 JDK 1.6.x 릴리즈 중 하나에서 시작하여 기본적으로 epoll을 사용합니다.이 셀렉터 인은 소켓 자체가 사용하는 디스크립터 외에 이전의 파일 디스크립터보다 더 많은 파일 디스크립터를 사용합니다. 하나의 SocketChannel에 여러 개의 Selector를 등록하는 경우 (예 : 읽기 및 쓰기 용 선택기) 파일 설명자를 많이 사용합니다. Netty가 NIO를 사용한다면 거의 확실하게 선택자를 사용합니다. 한 응용 프로그램에서 내 파일 설명자 대 소켓 비율은 epoll 기반 선택기를 사용하기 때문에 약 4 대 1이었습니다. java.nio.channels.spi.SelectorProvider 속성을 변경하여 이전 선택기 구현으로 되돌릴 수 있으며 설명자 수는 줄이긴하지만 성능 비용 (YMMV)은 줄입니다.