2012-04-18 5 views
4

파일 설명자 누수가 발생하는 비교적 큰 코드베이스에서 작업 중이며 특정 프로그램을 실행 한 후 프로세스가 파일을 열 수 없다는 불평을 시작합니다. 이 6 일 이후에 발생하지만커널에서의 파일 설명자 누수 디버깅

, 나는 실행 많은 프로세스가 있습니다 9000

에/proc 디렉토리 /에서 sys/FS/파일 최대의 값을 줄여 3~4시간에서 문제를 재현 할 수 있어요 언제든지. 나는 누수의 원인이 될 수있는 프로세스의 포인트 커플을 고정시킬 수있었습니다. 그러나 lsof 또는/proc/fd를 통해 파일 설명자 유출이 표시되지 않습니다.

내가 누출이 의심되는 프로세스 (서로 의사 소통)를 죽이면 누출이 사라집니다. FD가 릴리스됩니다.

while (1) 루프의 cat/proc/sys/fs/file-nr 루프가 누수를 나타냅니다. 그러나 어떤 프로세스에서도 누출이 보이지 않습니다. 여기

내가 무슨 일이 일어나고 그 누출을 감지하는 쓴 스크립트입니다

#!/bin/bash 

if [ "$#" != "2" ];then 
    name=`basename $0` 
    echo "Usage : $name <threshold for number of pids> <check_interval>" 
    exit 1 
fi 


fd_threshold=$1 
check_interval=$2 
total_num_desc=0 
touch pid_monitor.txt 
nowdate=`date` 
echo "=================================================================================================================================" >> pid_monitor.txt 
echo "****************************************MONITORING STARTS AT $nowdate***************************************************" >> pid_monitor.txt 

while [ 1 ] 
do 
    for x in `ps -ef | awk '{ print $2 }'` 
    do 
     if [ "$x" != "PID" ];then 
      num_fd=`ls -l /proc/$x/fd 2>/dev/null | wc -l` 
      pname=`cat /proc/$x/cmdline 2> /dev/null` 
      total_num_desc=`expr $total_num_desc + $num_fd` 
      if [ $num_fd -gt $fd_threshold ]; then 
       echo "Proces name $pname($x) and number of open descriptor = $num_fd" >> pid_monitor.txt 
      fi 
     fi 
    done 
    total_nr_desc=`cat /proc/sys/fs/file-nr` 
    lsof_desc=`lsof | wc -l` 
    nowdate=`date` 
    echo "$nowdate : Total number of open file descriptor = $total_num_desc lsof desc: = $lsof_desc file-nr descriptor = $total_nr_desc" >> pid_monitor.txt 
    total_num_desc=0 
    sleep $2 
done 

./monitor.fd.sh 500 2 & 꼬리 -f pid_monitor.txt

앞서 언급 한 바와 같이, 나는/proc/fd에 어떤 누수가있는 것을 보지 못했지만 누수가 확실히 일어나고 있으며 시스템은 파일 기술자가 부족합니다.

커널에서 누출이 의심됩니다. Linux 커널 버전 2.6.23. 내 질문은

은 다음과 같습니다

  1. 윌 'LS/PROC // FD'쇼 목록 설명을 PID와 프로세스에 링크 된 라이브러리. 라이브러리에 누수가있는 경우 어떻게 연결해야 하는지를 어떻게 결정합니까?

  2. 커널과 사용자 공간에 누출이 있는지 어떻게 확인합니까?

  3. 커널에 누수가 있으면 디버깅 할 때 어떤 도구를 사용할 수 있습니까?

  4. 나에게 줄 수있는 다른 팁.

끈기있게 질문 해 주셔서 감사합니다.

정말 도움이됩니다.

+0

1. 네, 링크 된 도서관을 포함한 모든 기술자를 보여줍니다. 2. 커널에서 fd가 유출되는 것은 거의 없습니다. 3. 2를보십시오. 4. 문제가 무엇인지 명확하지 않습니다. 더 자세한 정보를 제공 할 수 있습니까? 어떤 시스템 콜이 실패하고 어떤 에러가 있습니까? – strkol

답변

0

어떤 프로세스가 불평을 시작합니까? 그리고 당신이 본 오류는 무엇입니까? 모니터링 스크립트의 출력은 무엇입니까?

파일을 열려면 파일 설명 자와 struct file 또는 파일 설명의 두 가지가 필요합니다. 파일 디스크립터는 userspace가 사용하는 것으로, 커널 내부에서 struct file을 검색하는 데 사용됩니다. 당신이 누출되는 것이 분명하지 않습니다.

0

문제의 해결책을 찾았습니다.

일부 기능에서 공유 메모리 연결이 발생했으며 해당 기능이 30 초마다 호출됩니다. 공유 메모리 연결은 분리되지 않았으므로 설명자 유출이 발생했습니다.나는/proc // fd가 공유 메모리를 디스크립터로 첨부하지 않는다고 생각한다. 따라서 내 스크립트는 디스크립터를 유출하는 프로세스를 캐시 할 수 없었습니다.