@oligofren
나는 또한 방법을 결정하는 몇 가지 테스트 수행 "ulimits -Sn"
을 위해이 "open files"
시행되었다.
포스터처럼 선택된가 에 언급 된 링크 에 대한 ulimit를이 "open files"
참으로 프로세스 당 적용됩니다. 프로세스의 현재 한계가 무엇인지 확인하려면 다음을 수행하십시오.
cat /proc/__process_id__/limits
프로세스가 얼마나 많은 파일을 열 었는지 확인하려면 다음 명령을 사용해야합니다.
lsof -P -M -l -n -d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt' -p __process_id__ -a | awk '{if (NR>1) print}' | wc -l
위의 설명 및 테스트 방법 / 결과
"-P -M -l -n"
인수 lsof를가 하도록 단순히있다 lsof를가 할 수있는 한 가장 빠른 속도로 작동합니다. 자유롭게 꺼내십시오.
-P - inhibits the conversion of port numbers to port names for network files
-M - disable reporting of portmapper registrations for local TCP, UDP and UDPLITE ports
-l - inhibits the conversion of user ID numbers to login names
-n - inhibits the conversion of network numbers to host names for network files
이 "-d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt'"
인수는 lsof
cwd / err / ltx / mem / mmap / pd / rtd / txt 유형의 파일 디스크립터를 제외 하도록 지시 합니다.
lsof 매뉴얼 페이지에서 :
FD is the File Descriptor number of the file or:
cwd current working directory;
Lnn library references (AIX);
err FD information error (see NAME column);
jld jail directory (FreeBSD);
ltx shared library text (code and data);
Mxx hex memory-mapped type number xx.
m86 DOS Merge mapped file;
mem memory-mapped file;
mmap memory-mapped device;
pd parent directory;
rtd root directory;
tr kernel trace file (OpenBSD);
txt program text (code and data);
v86 VP/ix mapped file;
"Lnn,jld,m86,tr,v86"
Linux에는 해당되지 않는 것으로 간주 되어 제외 목록에 추가하지 않았습니다. 확실하지 않습니다 "Mxx"
.
응용 프로그램 차종은 메모리 매핑 된 파일의 사용하는 경우 / 디바이스 당신은 제거 할 수 있습니다 "^mem"
및 "^mmap"
제외 목록에서.
편집 --- 저격 시작 ---
편집 : 나는 그것을 나타내는 다음 링크 를 발견 했다.
메모리 매핑 된 .so 파일은 기술적으로 응용 프로그램이 제어하는 파일 핸들과 다릅니다. / proc // fd는 열린 파일 디스크립터의 측정 지점입니다.
따라서 프로세스에서 메모리 매핑 된 파일을 사용하는 경우 * .so 파일을 필터링해야합니다.
또한 Sun의 JVM은 jar 파일을 메모리 맵에 저장합니다
메모리 맵핑 JAR 파일 (이 경우 "JDK 클래스"를 보유하는 파일) JAR을 메모리 맵핑 할 때, 매번 처음부터 파일을 읽는 것과는 달리 JAR 파일 내의 파일에 매우 효율적으로 액세스 할 수 있습니다. Sun JVM은 클래스 경로의 모든 JAR을 메모리 매핑합니다. 애플리케이션 코드가 JAR에 액세스해야하는 경우 메모리 맵핑 할 수도 있습니다.
따라서 tomcat / glassfish와 같은 것들도 메모리 매핑 jar 파일을 보여줍니다. 나는 이것들이 한계에 해당하는지 테스트하지 않았다"ulimit -Sn"
.
편집 --- 끝 싹둑 ---
경험적으로, 나는 것으로 나타났습니다 "cwd,rtd,txt"
되어 계산되지 프로세스 당 파일 제한에 관해서 (ulimit를 -Sn)와 함께.
"err,ltx,pd"
이러한 디스크립터 유형의 파일 핸들을 작성하는 방법을 모르므로 파일 제한에 포함 되는지 확실 하지 않습니다.
"-p __process_id__"
인수 제한합니다은 lsof
단지에 대한 정보를 반환 __process_id__
지정합니다. 모든 프로세스 수를 얻으려면 이것을 제거하십시오.
"-a"
인수하는 데 사용됩니다 및 선택 사항 (즉, "-p"와 "-d"인수).
이 "awk '{if (NR>1) print}'"
명령문은 lsof
출력으로 인쇄 되는 헤더를 건너 뛰는 데 사용됩니다 .
다음 perl 스크립트를 사용하여 테스트했습니다.
File: test.pl
---snip---
#!/usr/bin/perl -w
foreach $i (1..1100) {
$FH="FH${i}";
open ($FH,'>',"/tmp/Test${i}.log") || die "$!";
print $FH "$i\n";
}
---snip---
스크립트가 파일 디스크립터를 종료하고 해제하지 않도록 perl 디버거에서 스크립트를 실행해야했습니다.
실행하다: perl -d test.pl
perl의 디버거에서 c
enter 를 입력 하고 눌러 프로그램을 실행할 수 ulimit -Sn
있으며 값이 1024 인 경우에 Test1017.log
파일을 작성한 후 프로그램이 중지 됩니다 /tmp
.
이제 perl 프로세스의 pid를 식별하고 위의 lsof
명령을 사용하면 1024 도 출력 함을 알 수 있습니다 .
1024 제한에 포함 된 파일 목록을 보려면를 제거하고 "wc -l"
a "less"
로 바꾸 십시오 . 및 설명자가 한계에 포함 되지 않았는지 확인 하려면 인수를 제거하십시오 ."-d ^....."
cwd,txt
rtd
이제를 실행 "ls -l /proc/__process_id__/fd/ | wc -l"
하면 1025 값이 반환됩니다. 계산에 출력에 헤더를 ls
추가 했기 때문 "total 0"
입니다.
노트 :
OS에 파일 디스크립터가 부족한지 확인하려면 다음 값 을 비교 하는 것이 좋습니다 .
cat /proc/sys/fs/file-nr | awk '{print $1}'
와
cat /proc/sys/fs/file-max
https://www.kernel.org/doc/Documentation/sysctl/fs.txt는 무엇 file-nr
을 file-max
의미 하는지 문서화합니다 .