“encontra” arquivos abertos?

5

Eu recentemente emiti este comando: find . -type f | wc -l

Para contar quantos arquivos estão na minha pasta public_html.

Pouco depois, o Nginx retornou 500 erros internos do servidor e error.log estava sendo inundado com o erro "too many open files". Eu pensei que talvez isso pudesse ser a fonte desse problema?

    
por Tar 06.07.2012 / 05:07

2 respostas

14

Olhando para strace -eopen find . -type f com o GNU find (4.4.2 do Debian Squeeze) a resposta parece ser "no, find não abre arquivos", mas faz diretórios abertos:

open("details", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5
open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5
open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5
open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5
open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5
open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5
open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5
open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5
open(".uml", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5
open(".dbus", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5

É claro que todos esses comandos retornaram o mesmo filehandle #, o que implica strongmente que find está fechando-os novamente. Eu fiz um conjunto bastante profundo de diretórios e parece que o find usa .. para ir até um diretório em vez de manter o diretório aberto.

Parece, no entanto, uma coincidência realmente notável.

    
por 06.07.2012 / 05:23
0

Arquivos SÃO diretórios, é claro, e se o achado não os estivesse fechando enquanto seguia em frente, você teoricamente estaria correndo um pequeno risco em algum Unixen. Execute o total

strace find . -type f

e observe a sequência (do linux):

openat(AT_FDCWD, "a", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 6
fchdir(6)                               = 0
getdents(6, /* 4 entries */, 32768)     = 104
getdents(6, /* 0 entries */, 32768)     = 0
close(6)
...
    
por 07.07.2012 / 11:43

Tags