A otimização das solicitações de metadados que o ossfs 2.0 envia ao OSS reduz os custos de chamadas de API, melhora a simultaneidade e acelera as operações de leitura/gravação nos pontos de montagem.
Princípios básicos
O ossfs 2.0 é construído sobre o framework FUSE (Filesystem in Userspace). Ele converte operações de metadados do sistema de arquivos em solicitações ao OSS, permitindo que você acesse recursos de armazenamento do OSS por meio de interfaces padrão do sistema de arquivos.
|
Comando |
Regras de conversão de interface |
|
|
Ao executar operações Se a solicitação GetObjectMeta retornar uma resposta 404 (indicando que o objeto não existe), ele enviará uma solicitação ListObject(max-keys=1) para verificar se existe um objeto de pasta virtual com o mesmo nome. |
|
|
|
|
|
Ao executar operações Observe que o ossfs 2.0 habilita o recurso |
|
|
Análise de cenários
O acesso a um arquivo por meio de um sistema de arquivos difere significativamente do acesso direto ao objeto correspondente no OSS.
Métodos de acesso a arquivos
O ossfs resolve caminhos de arquivos de cima para baixo a partir do diretório raiz. Por exemplo, para obter os atributos de /dir/object, o comando stat /dir/object é executado da seguinte forma:
-
Primeiro, uma operação é realizada em /dir, enviando uma solicitação GetObjectMeta dir. Se retornar 404 Not Found, indica que o objeto não existe, e então uma solicitação ListObject (max-keys=1)dir/ é enviada. Se retornar 200 OK, indica que existe uma pasta virtual correspondente.
-
Uma operação é realizada em /dir/object, enviando uma solicitação GetObjectMeta dir/object. Se retornar 200 OK, as informações de atributos do objeto são obtidas com sucesso.
Um único comando stat /dir/object resulta em duas solicitações GetObjectMeta e uma solicitação ListObject. Como cada componente do caminho requer suas próprias consultas de metadados, o número de solicitações ao OSS cresce com a profundidade do arquivo, o que degrada o desempenho.
Impacto do cache de metadados de arquivos
O ossfs 2.0 habilita o cache de metadados de arquivos por padrão, com um período de validade padrão de 60 segundos. A capacidade do cache de metadados é implementada com base na API de baixo nível do FUSE e é determinada pelo kernel do sistema operacional quanto ao momento de descartar. Máquinas com mais memória geralmente podem armazenar mais informações de metadados em cache.
O exemplo a seguir mostra como o cache de metadados afeta o desempenho ao ler atributos de 100 arquivos filhos no diretório /dir/.
-
Sem cache de metadados
-
Acessando arquivos com uma lista de arquivos conhecida:
Ao executar o comando
stat /dir/object-<i>em um loop, cada operaçãostatserá convertida em uma solicitação GetObjectMeta, gerando no total 100 solicitações GetObjectMeta enviadas ao OSS para obter atributos de arquivos, resultando em muitas solicitações de metadados que afetam o desempenho. -
Acessando arquivos com uma lista de arquivos desconhecida:
Ao executar o comando
ls, essa operação será convertida em uma solicitação ListObject enviada ao OSS para obter a lista de arquivos, e então o comandostat /dir/object-<i>é executado em um loop para obter os atributos dos arquivos com base na lista obtida. Isso gerará no total uma solicitação ListObject e 100 solicitações GetObjectMeta enviadas ao OSS, resultando em muitas solicitações de metadados que afetam o desempenho.
-
-
Com cache de metadados
-
Acessando arquivos com uma lista de arquivos conhecida:
Ao executar o comando
stat /dir/object-<i>em um loop, cada operaçãostatserá convertida em uma solicitação GetObjectMeta, gerando no total 100 solicitações GetObjectMeta. Essas 100 solicitações acessarão diretamente o cache local de metadados para obter os atributos dos arquivos dentro do período de validade do cache, reduzindo efetivamente o número de solicitações enviadas ao OSS. -
Acessando arquivos com uma lista de arquivos desconhecida:
Ao executar o comando
ls, essa operação será convertida em uma solicitação ListObject enviada ao OSS enquanto atualiza o cache local de metadados. Após a conclusão da atualização do cache, ao executar o comandostat /dir/object-<i>em um loop, como os metadados já estão no cache local, nenhuma solicitação adicional ao OSS será enviada.
-
O cache de metadados reduz efetivamente as solicitações repetidas ao OSS. Ao percorrer todos os arquivos em uma pasta, executar o comando ls primeiro pré-carrega o cache e elimina as solicitações subsequentes ao OSS por arquivo.
Métodos de otimização
Use os seguintes métodos para reduzir as solicitações de metadados ao OSS e melhorar o desempenho:
Estender o tempo de cache de metadados
Se seus dados são imutáveis após o upload ou mudam com pouca frequência em relação à duração do cache, aumente a opção de montagem attr_timeout para estender o período de validade do cache de metadados e reduzir solicitações repetidas.
-
Cenário de negócios: Em um cenário de anotação de dados, o sistema lê um lote de dados brutos coletados anteriormente, processa-os e gera um novo lote de dados. Nesse cenário, os dados brutos não serão modificados após serem carregados no OSS.
-
Configuração de montagem: No arquivo de configuração do ossfs 2.0, configure o período de validade do cache de metadados para 7200 segundos.
# Bucket Endpoint (region node) --oss_endpoint=https://oss-cn-hangzhou-internal.aliyuncs.com # Bucket name --oss_bucket=bucketName # Metadata cache validity period --attr_timeout=7200 # Access keys AccessKey ID and AccessKey Secret (optional for ossfs 2.0.1 and later versions) --oss_access_key_id=LTAI****************** --oss_access_key_secret=8CE4**********************
Operar após obter a lista de arquivos
Antes de acessar arquivos individuais em um diretório, execute o comando ls ou envie uma solicitação ListObject para pré-carregar todos os metadados dos arquivos no cache local. Combinado com um período de validade de cache mais longo, isso elimina as solicitações repetidas por arquivo ao OSS.
Você pode substituir o comando ls por qualquer programa que leia o conteúdo do diretório. Os exemplos a seguir listam os arquivos no diretório /mnt/data/.
Python
os.listdir('/mnt/data/')
Go
entries, err := os.ReadDir("/mnt/data/")
C
dir = opendir("/mnt/data/");
if (dir != NULL) {
struct dirent *entry;
while((entry = readdir(dir)) != NULL) {}
closedir(dir);
}
Usar cache negativo para acelerar a criação de arquivos
Para criar um novo arquivo, um sistema de arquivos executa duas chamadas de sistema em sequência: lookup e create.
-
A operação
lookupdetermina se o arquivo correspondente existe. No ossfs 2.0, essa operação é traduzida em uma solicitação GetObjectMeta e uma solicitação ListObjects. -
Se um erro 404 Not Found for retornado, o ossfs cria o arquivo usando a operação
create. Quando o ossfs 2.0 executa ocreate, ele também envia uma solicitação GetObjectMeta e uma solicitação ListObjects para verificar se o arquivo existe no OSS.
Portanto, o processo de criação de um novo arquivo envolve quatro operações de consulta de metadados ao OSS.
O ossfs 2.0 suporta o armazenamento em cache de solicitações `404` retornadas pelo OSS para reduzir solicitações duplicadas subsequentes. Para habilitar esse recurso, especifique as seguintes opções ao montar o sistema de arquivos:
-
--oss_negative_cache_timeout=30(O valor padrão é 0 segundos. Recomendamos que você defina esse valor como menor que o valor deattr_timeout.) -
--oss_negative_cache_size=10000(Valor padrão: 10000)
Quando o cache negativo do OSS está habilitado, a solicitação 404 da operação lookup para um novo arquivo é armazenada em cache. Como resultado, a consulta subsequente durante a operação create acessa o cache negativo e nenhuma solicitação é enviada ao OSS. Isso reduz o número de solicitações ao OSS para o processo de criação de arquivos de quatro para duas.
Após habilitar o cache negativo do OSS, se uma entrada de cache 404 para um arquivo chamado object-A estiver armazenada em cache, o arquivo será visível no ponto de montagem somente após a expiração da entrada de cache, mesmo que você crie imediatamente o object-A no OSS. O período de validade do cache é especificado por oss_negative_cache_timeout. Não recomendamos que você habilite esse recurso em cenários que exigem alta consistência de dados.
Comparação de desempenho
Método de teste: Monte um Bucket OSS com o ossfs 2.0 em uma instância ECS na mesma região usando um endpoint interno com cache de metadados habilitado e, em seguida, leia os metadados de 10.000 arquivos no diretório montado.
Resultados do teste
|
Operação |
Tempo consumido |
|
Sem pré-carregamento do cache de metadados (lendo metadados de arquivos na pasta diretamente sem executar o comando |
111 segundos |
|
Com pré-carregamento do cache de metadados (executando o comando |
18 segundos |
Conclusão do teste: O pré-carregamento do cache de metadados antes do acesso em massa a arquivos, combinado com um período de validade de cache apropriado, reduz significativamente as solicitações de metadados ao OSS e melhora o desempenho geral.