Eficiência de lotes de relógios inotify ou stat calls

4

Estou desenvolvendo software que utilizará inotify para rastrear alterações em uma grande quantidade de arquivos (dezenas a centenas de milhares de arquivos). Eu tenho essas idéias:

  • um relógio por arquivo
  • um relógio por diretório pai
  • evite inotificar e verifique periodicamente o fs quanto a alterações (não preferenciais)

Eu terei um banco de dados de todos os arquivos que estou assistindo e algumas informações básicas de estatísticas (como mtime e tamanho), no entanto, eu teria que declarar cada arquivo nesse diretório até encontrar o que mudou.

Qual seria mais rápido, toneladas (100.000+) de relógios inotify ou toneladas de chamadas stat?

Estou pensando que reduzir o número de chamadas de estatísticas seria melhor, mas não sei o suficiente sobre inotify.

Nota:

Isso será executado em uma estação de trabalho, não em um servidor. Seu principal objetivo é sincronizar as mudanças (potencialmente para um sistema de arquivos inteiro) entre um cliente e um servidor remoto.

    
por beatgammit 09.08.2011 / 03:37

1 resposta

2

Quando vocêread() um inotify fd, o campo name da estrutura retornada informa qual arquivo foi modificado em relação ao diretório que está sendo assistido, portanto, você não deve ter que declarar todos os arquivos em um diretório após o evento .

Veja link

Especificamente:

struct inotify_event {
    int      wd;       /* Watch descriptor */
    uint32_t mask;     /* Mask of events */
    uint32_t cookie;   /* Unique cookie associating related
                          events (for rename(2)) */
    uint32_t len;      /* Size of 'name' field */
    char     name[];   /* Optional null-terminated name */
};

The name field is only present when an event is returned for a file inside a watched directory; it identifies the file pathname relative to the watched directory. This pathname is null-terminated, and may include further null bytes to align subsequent reads to a suitable address boundary.

    
por 09.08.2011 / 03:47