Tarefas de sincronização em lote lentas desperdiçam tempo de pipeline e podem bloquear processos downstream. As tarefas do Data Integration podem apresentar baixo desempenho por diversos motivos: espera por recursos de agendamento ou execução, leitura ou gravação lentas, baixa concorrência ou chaves de divisão mal configuradas. Este tópico explica como usar os logs da tarefa para identificar o estágio do gargalo, ajustar a concorrência e as chaves de divisão para maximizar a vazão e aplicar limites de taxa para proteger bancos de dados de produção.
Fatores que afetam a velocidade de sincronização
Quatro categorias de fatores determinam a velocidade de execução de uma tarefa de sincronização:
|
Fator |
Detalhes |
|
Banco de dados de origem |
CPU, memória, disco e largura de banda de rede. Maior concorrência aumenta a carga no banco de dados; bancos com melhor desempenho suportam configurações de concorrência mais elevadas. |
|
Resource group de agendamento |
Um resource group de agendamento envia tarefas de sincronização offline para um resource group de integração de dados para execução. O uso de recursos de agendamento impacta a eficiência geral. |
|
Configuração da tarefa |
Velocidade máxima de transferência, concorrência (threads lendo da origem ou gravando no destino em paralelo), recursos WAIT, configuração Bytes (padrão: 1.048.576 bytes por thread — reduza este valor se ocorrerem timeouts de rede) e uso de índices nas instruções de consulta. |
|
Banco de dados de destino |
CPU, memória, disco e largura de banda de rede. Alta carga no destino reduz a eficiência de gravação. |
Diagnosticar tarefas de sincronização lentas
Abra o log da tarefa e o Detail log para identificar qual estágio da execução está lento. A tabela a seguir resume cada estágio e seu principal sinal no log:
|
Estágio |
Sinal no log |
Significado |
|
Aguardando recursos de agendamento |
A tarefa está aguardando o gateway; longo tempo de espera por recursos na página de propriedades da instância |
O resource group de agendamento atingiu seu limite de tarefas |
|
Aguardando recursos de execução |
|
O resource group de integração de dados não possui slots de concorrência restantes suficientes |
|
Leitura de dados lenta |
|
A tarefa demora muito para receber dados da origem |
|
Gravação de dados lenta |
|
A tarefa demora muito para gravar dados no destino |
|
Velocidade diferente de zero, mas progresso geral lento |
|
Baixa concorrência, chave de divisão mal configurada, dirty data ou carga elevada no banco de dados |
O estágio com o maior tempo de espera representa o gargalo. Comece a solução de problemas por ele.
Para obter mais informações sobre logs de tarefas de sincronização offline, consulte Análise de logs de sincronização offline .
Estágio 1: Aguardando recursos de agendamento
Sintomas:
O log da tarefa indica que ela está aguardando o gateway.
A página de propriedades da instância apresenta um longo tempo de espera por recursos.
Causa: O resource group de agendamento atingiu seu limite máximo de tarefas. Novas tarefas aguardam até que as tarefas em execução sejam concluídas e liberem recursos.
Solução: No console do DataWorks, acesse a página Run diagnostics para verificar quais tarefas consomem recursos enquanto a tarefa atual aguarda.
Se você utiliza shared resource groups para agendamento, migre suas tarefas para um exclusive resource group ou um Serverless resource group.
Estágio 2: Aguardando recursos de execução
Sintoma: O log da tarefa exibe wait.
Causa: O resource group de integração de dados não possui slots de concorrência restantes suficientes para a tarefa.
Por exemplo: um resource group suporta no máximo 8 slots concorrentes. Se duas tarefas estiverem em execução com concorrência de 3 cada, elas ocupam 6 slots e restam 2 disponíveis. Uma terceira tarefa que necessite de 3 slots concorrentes precisará aguardar.
Solução:
Acesse a página Run diagnostics para identificar quais tarefas consomem recursos.
Verifique se alguma tarefa em execução está travada ou anormalmente lenta. Nesse caso, interrompa-a ou resolva o problema primeiro.
Se as tarefas estiverem executando normalmente, aguarde sua conclusão e a liberação dos recursos.
Coordene com os responsáveis pelas tarefas para reduzir a concorrência das tarefas concorrentes.
Reduza a concorrência da tarefa atual e reenvie-a.
Escale horizontalmente o resource group. Para mais informações, consulte Operações de escalonamento.
O número máximo de slots concorrentes varia conforme a especificação do resource group. Para mais detalhes, consulte Métricas de desempenho e faturamento .
Estágio 3: Leitura de dados lenta (WaitReaderTime elevado)
Sintoma: O log da tarefa mostra run com velocidade igual a 0. O Detail log apresenta um valor alto para WaitReaderTime, indicando que a tarefa aguarda dados da origem por muito tempo.
Causas:
A chave de divisão não está configurada corretamente, tornando lenta a execução do SQL de recuperação de dados.
Os parâmetros
whereouquerySqlnão possuem índice, resultando em full table scan.O banco de dados de origem está sob alta carga durante a sincronização.
Problemas de largura de banda ou latência de rede.
Não é possível garantir a velocidade de sincronização pela rede pública.
Solução:
Crie índices nos campos usados para filtragem de dados a fim de evitar full table scans.
Evite ou reduza funções complexas nas instruções pre-SQL ou post-SQL. Se necessário, execute essas operações no banco de dados antes do início da sincronização.
Se a tabela de origem for muito grande, divida a tarefa em várias tarefas menores.
Consulte os logs para identificar a instrução SQL causadora do bloqueio e trabalhe com o administrador do banco de dados para resolvê-la.
Verifique a carga do banco de dados de origem no momento da sincronização.
Estágio 4: Gravação de dados lenta (WaitWriterTime elevado)
Sintoma: O log da tarefa exibe run com velocidade igual a 0. O Detail log mostra um valor alto para WaitWriterTime, indicando que a tarefa demora muito para gravar no destino.
Causas:
As instruções
preSqloupostSqlno plug-in writer apresentam execução lenta.O banco de dados de destino está sob alta carga durante a sincronização.
Problemas de largura de banda ou latência de rede.
Não é possível garantir a velocidade de sincronização pela rede pública.
Solução:
Revise e otimize as instruções
preSqlepostSqlna configuração do plug-in writer.Verifique a carga do banco de dados de destino no momento da sincronização.
Estágio 5: Velocidade diferente de zero, mas progresso geral lento
Sintoma: O log da tarefa mostra run com velocidade diferente de zero, mas a tarefa de sincronização leva muito mais tempo do que o esperado.
Causas:
A chave de divisão para uma tarefa de banco de dados relacional não foi configurada ou está incorreta, invalidando a configuração de concorrência. A tarefa executa com uma única thread em vez da concorrência configurada.
A configuração de concorrência está muito baixa.
Um grande volume de dirty data é gerado durante a sincronização.
O desempenho do banco de dados é insuficiente para sustentar a concorrência configurada.
Problemas de largura de banda ou latência de rede.
Não é possível garantir a velocidade de sincronização pela rede pública.
Solução:
Configure a chave de divisão corretamente. Para etapas de configuração, consulte Configurar uma tarefa na UI codeless.
Aumente a concorrência da tarefa. Dentro da cota máxima de concorrência suportada pelo resource group, planeje a concorrência entre todas as tarefas e aumente a concorrência da tarefa atual conforme necessário. Configure a concorrência na UI codeless ou defina-a diretamente no editor de código. Para limites de resource groups, consulte Métricas de desempenho e faturamento. Para tarefas distribuídas, garanta que:
concorrência da tarefa ÷ número de máquinas no resource group ≤ concorrência máxima por máquinaTrate dirty data. Para mais informações, consulte Data Integration.
Use uma rede privada para sincronização entre clouds ou regiões. Para opções de conectividade de rede, consulte Soluções de conectividade de rede.
Verifique a carga do banco de dados no momento da sincronização.
Limitar a velocidade de sincronização
Por padrão, as tarefas do Data Integration executam na maior velocidade possível dentro do limite de concorrência configurado. Velocidades elevadas podem exercer pressão excessiva sobre o banco de dados de produção. Utilize a limitação de taxa para restringir a vazão.
Mantenha o limite de taxa em ou abaixo de 30 MB/s para evitar sobrecarregar o banco de dados de produção.
O exemplo a seguir define um limite de taxa de 1 MB/s no editor de código:
"setting": {
"speed": {
"throttle": true, // Set to true to enable rate limiting.
"mbps": 1 // The rate limit in MB/s.
}
}
Comportamento de throttle:
true: A limitação de taxa está ativada. É obrigatório definirmbpscom um valor específico. Casombpsnão seja definido, a tarefa falhará ou apresentará comportamento anormal.false: A limitação de taxa está desativada. O valor dembpsserá ignorado.
Medição de tráfego: A taxa medida pelo Data Integration reflete o tráfego interno do canal, não o tráfego real da interface de rede (NIC). O tráfego da NIC geralmente é de 1 a 2 vezes superior ao tráfego do canal, dependendo de como o sistema de armazenamento de dados serializa as informações.
Limitação de taxa para arquivos semiestruturados: Arquivos semiestruturados individuais não podem ser divididos e não utilizam chave de divisão. Para múltiplos arquivos, defina um limite de taxa de job para aumentar a vazão. A taxa máxima efetiva depende do número de arquivos. Para n arquivos:
Um limite de
n+1MB/s resulta em uma vazão real denMB/s.Um limite de
n-1MB/s resulta em uma vazão real den-1MB/s.
Limitação de taxa para bancos de dados relacionais: Defina tanto um limite de taxa de job quanto uma chave de divisão. A chave de divisão permite o particionamento da tabela alinhado ao limite de taxa. Bancos de dados relacionais geralmente suportam apenas chaves de divisão numéricas. Bancos de dados Oracle suportam chaves de divisão numéricas e de string.
FAQ
BatchSize e maxfilesize: Estes parâmetros controlam o número de registros confirmados por lote. Valores maiores reduzem idas e vindas na rede e melhoram a vazão, mas defini-los muito altos pode causar erro de out-of-memory (OOM) no processo de sincronização. Se ocorrer um erro OOM, consulte FAQ sobre sincronização offline.
Apêndice: Visualizar a concorrência real
Na página de detalhes do log da tarefa, localize uma entrada de log semelhante a:
JobContainer - Job set Channel-Number to 2 channels
O valor de channels representa a concorrência real que a tarefa utiliza.
[ResponseError]:
AccessDenied
xxx
xxx
2020-09-07 00:26:15.462 [job-323683754] INFO OdpsWriter$Job - blockSizeInMB=64.
2020-09-07 00:26:15.462 [job-323683754] INFO JobContainer - jobContainer starts to do prepare ...
2020-09-07 00:26:15.463 [job-323683754] INFO JobContainer - DataX Reader.Job [ossreader] do prepare work .
2020-09-07 00:26:15.491 [job-323683754] INFO OssReader$Job - add object [user_log.txt] as a candidate to be read.
2020-09-07 00:26:15.493 [job-323683754] INFO JobContainer - DataX Writer.Job [odpswriter] do prepare work .
2020-09-07 00:26:15.494 [job-323683754] INFO IdAndKeyUtil - xxx
2020-09-07 00:26:15.494 [job-323683754] INFO OdpsWriter$Job - xxx
2020-09-07 00:26:18.045 [job-323683754] INFO OdpsUtil - Try to xxx
2020-09-07 00:26:19.435 [job-323683754] INFO OdpsUtil - Try to xxx
alter table xc_ods_raw_log_d add IF NOT EXISTS partition(dt='20200906');
] .
2020-09-07 00:26:21.860 [job-323683754] INFO JobContainer - jobContainer starts to do split ...
2020-09-07 00:26:21.860 [job-323683754] INFO JobContainer - Job set Channel-Number to 2 channels.
2020-09-07 00:26:22.120 [job-323683754] INFO UnstructuredSplitUtil - File to be read:[{"end" xxx ,"filePath":"user_lxxx
2020-09-07 00:26:22.121 [job-323683754] INFO UnstructuredSplitUtil - File to be read:[{"end"
2020-09-07 00:26:22.121 [job-323683754] INFO JobContainer - DataX Reader.Job [ossreader] splits to [2] tasks.
Apêndice: Concorrência e uso de recursos em exclusive resource groups
Entender como a concorrência se relaciona com CPU e memória ajuda a planejar o envio de tarefas e evitar contenção de recursos.
Concorrência e CPU
Em um exclusive resource group, a proporção entre concorrência e vCPU é de 1:0,5. Uma instância ECS com 4 vCPUs e 8 GiB de memória fornece uma cota de concorrência de 8. Isso significa:
Até 8 tarefas de sincronização offline com concorrência de 1, ou
Até 4 tarefas de sincronização offline com concorrência de 2.
Se uma nova tarefa enviada exigir mais concorrência do que a cota restante disponível, ela aguardará até que as tarefas em execução sejam concluídas e liberem recursos.
Se a concorrência de uma tarefa exceder a cota máxima do resource group, ela aguardará indefinidamente e bloqueará tarefas subsequentes. Por exemplo, enviar uma tarefa com concorrência de 10 para um resource group em uma instância ECS de 4 vCPU / 8 GiB fará com que a tarefa nunca execute.
Concorrência e memória
O uso de memória por tarefa em um exclusive resource group segue esta fórmula:
Min{768 + (concurrency - 1) × 256, 8029} MB
Substitua essa configuração no editor de código definindo o caminho JSON $.setting.jvmOption.
"setting": {
"errorLimit": {
"record": "0"
},
"speed": {
"throttle": false,
"concurrent": 1
},
"jvmOption": "-Xms1024m -Xmx1024m"
}
Para manter a estabilidade das tarefas, a memória total usada por todas as tarefas em execução deve permanecer pelo menos 1 GB abaixo da memória total de todas as máquinas no resource group. Se esse limite for ultrapassado, o Linux OOM Killer poderá encerrar tarefas forçadamente.
Se você não substituir as configurações de memória no editor de código, apenas o limite da cota de concorrência será aplicado ao planejar o envio de tarefas.
Apêndice: Referência de velocidade de sincronização
As tabelas a seguir listam a vazão média de concorrência única para conectores comuns em um exclusive resource group. Use esses valores como base ao estimar a duração esperada da sincronização e ao definir a concorrência.
Esses números foram medidos sob condições controladas em um exclusive resource group. A vazão real varia dependendo do desempenho do seu banco de dados, condições de rede, volume de dados e especificação do resource group.
Plug-ins Writer
|
Writer |
Velocidade média de concorrência única (KB/s) |
|
AnalyticDB for PostgreSQL |
147,8 |
|
AnalyticDB for MySQL |
181,3 |
|
ClickHouse |
5.259,3 |
|
DataHub |
45,8 |
|
DRDS |
93,1 |
|
Elasticsearch |
74,0 |
|
FTP |
565,6 |
|
GDB |
17,1 |
|
HBase |
2.395,0 |
|
hbase20xsql |
37,8 |
|
HDFS |
1.301,3 |
|
Hive |
1.960,4 |
|
HybridDB for MySQL |
323,0 |
|
HybridDB for PostgreSQL |
116,0 |
|
Kafka |
0,9 |
|
SLS |
788,5 |
|
MongoDB |
51,6 |
|
MySQL |
54,9 |
|
MaxCompute |
660,6 |
|
Oracle |
66,7 |
|
OSS |
3.718,4 |
|
OTS |
138,5 |
|
PolarDB |
45,6 |
|
PostgreSQL |
168,4 |
|
Redis |
7.846,7 |
|
SQLServer |
8,3 |
|
Stream |
116,1 |
|
TSDB |
2,3 |
|
Vertica |
272,0 |
Plug-ins Reader
|
Reader |
Velocidade média de concorrência única (KB/s) |
|
AnalyticDB for PostgreSQL |
220,3 |
|
AnalyticDB for MySQL |
248,6 |
|
DRDS |
146,4 |
|
Elasticsearch |
215,8 |
|
FTP |
279,4 |
|
HBase |
1.605,6 |
|
hbase20xsql |
465,3 |
|
HDFS |
2.202,9 |
|
Hologres |
741,0 |
|
HybridDB for MySQL |
111,3 |
|
HybridDB for PostgreSQL |
496,9 |
|
Kafka |
3.117,2 |
|
SLS |
1.014,1 |
|
MongoDB |
361,3 |
|
MySQL |
459,5 |
|
MaxCompute |
207,2 |
|
Oracle |
133,5 |
|
OSS |
665,3 |
|
OTS |
229,3 |
|
OTSStream |
661,7 |
|
PolarDB |
238,2 |
|
PostgreSQL |
165,6 |
|
RDBMS |
845,6 |
|
SQLServer |
143,7 |
|
Stream |
85,0 |
|
Vertica |
454,3 |