MongoDB Java 드라이버(2.11.3)를 사용하는 Java 애플리케이션이 있습니다. 설명서에 명시된 대로 연결 풀링을 처리해야 하는 애플리케이션 전체에서 정적 MongoClient 인스턴스를 사용하고 있습니다. 오랜 시간이 지나면(Minecraft에 익숙하다면 BungeeCord입니다) 열린 파일이 너무 많다는 예외가 발생합니다. 보세요
$ lsof -p 7616 -n | grep "123.456.7.8:27017" | wc -l
6
포트 27017에 16개의 연결이 있음을 보여줍니다. 그러나 우리가 보면:
$ lsof -n | grep "123.456.7.8:27017" | awk '{print $2}' | grep 7616 | wc -l
438
첫 번째 명령보다 더 많은 연결을 보여줍니다.
첫 번째 질문은 이 두 명령의 출력이 서로 다른 이유이고, 두 번째 질문은 Java MongoDB 드라이버를 사용할 때 비슷한 상황을 경험한 사람이 있는지입니다.
답변1
실제 출력을 보지 않고는 확실히 말할 수 없지만 가장 가능성 있는 설명은 27017
다른 위치에서 발생한다는 것입니다. 첫 번째 명령은 PID가 있는 프로세스에 대한 파일을 나열한 5253
다음 다음을 포함하는 모든 줄을 인쇄합니다.27017
대기열의 어느 곳에서나.
두 번째 명령은 열려 있는 모든 파일을 인쇄한 다음 다시 다음을 포함하는 모든 줄을 선택합니다.27017
대기열의 어느 곳에서나. 나는 당신이 당신의 질문에 지적한 것과는 27017
달리 두 번째 명령에서도 실제로 greping하고 있다고 가정합니다.16062
어떤 경우에도 명령은 포트를 구체적으로 확인하지 않습니다 27017
. 사실, 왜 포트가 나열되기를 기대했는지조차 이해가 되지 않습니다. lsof
포트가 아닌 파일을 살펴보십시오. 예를 들어, 내 시스템에서 출력을 찾을 때 ssh
포트가 표시되지 않습니다.lsof -n
어쨌든 좀 더 구체적인 예를 들면 다음과 같습니다.
$ sudo lsof -np 7033 | head
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firefox 7033 terdon cwd DIR 8,6 491520 16646145 /home/terdon
firefox 7033 terdon rtd DIR 8,7 548864 2 /
firefox 7033 terdon txt REG 8,7 143680 1841618 /opt/firefox/firefox
firefox 7033 terdon DEL REG 0,30 10335506 /tmp/.glT5RaDf
firefox 7033 terdon mem REG 8,7 12303504 1573445 /usr/share/fonts/truetype/unifont/unifont.ttf
firefox 7033 terdon DEL REG 0,4 970489906 /SYSV00000000
firefox 7033 terdon mem REG 8,7 7470672 540090 /usr/lib/x86_64-linux-gnu/gstreamer-0.10/libgstffmpeg.so
firefox 7033 terdon mem REG 8,7 5177387 1580807 /usr/share/fonts/truetype/wqy/wqy-microhei.ttc
firefox 7033 terdon mem REG 8,7 120688 532953 /usr/lib/x86_64-linux-gnu/gstreamer-0.10/libgstvideoscale.so
검색어는 27017
모든 필드에서 일치할 수 있습니다. 크기, PID, 노드 등이 될 수 있습니다. 다른 번호의 일부일 수도 있습니다. 예를 들어:
$ printf "12345\n12" | grep 12
12345
12
위에서 볼 수 있듯이 12
단어를 구성하는 두 번째 줄뿐만 아니라 두 줄 모두에 일치 항목이 있습니다. 이 -w
스위치를 사용하여 grep
전체 단어만 일치시킬 수 있습니다 .
$ printf "12345\n12" | grep -w 12
12
따라서 두 번째 명령에서 PID로 출력을 제한하지 않기 때문에 두 grep
s는 각 줄의 어느 위치에서나 일치할 수 있으므로 물론 출력이 달라집니다.