Instâncias ideais do SQ3 por núcleo e scripts para gerenciá-las
21 respostas
Threshold
7 anos atrás #115144
Qual é o # ideal de instâncias do SQ3 que você executa por núcleo?
Eu faço 1 instância de SQ por núcleo e seu multithread, então faço 2 threads por SQ em meus antigos Dell Poweredges.
Existem programas ou scripts para gerenciar várias instâncias de software? Meu novo servidor tem 32 núcleos, o que significa 32 instâncias do SQ3, talvez 16, que provavelmente instalarei e executarei nele para obter velocidades ideais de geração de estratégias. Isso dá muito trabalho para alterar suas configurações e tudo mais se eu quiser que todas façam exatamente a mesma coisa.
mikeyc
7 anos atrás #137094
O SQ é multithread, você pode explicar por que faz isso? Talvez eu tenha perdido algo em uma discussão em algum lugar....
Threshold
7 anos atrás #137097
Você obtém resultados muito mais rápidos executando várias instâncias. O SQ3 usa multithreading/cores de forma muito ineficiente, mesmo com o hack do Zulu.
1 SQ por núcleo usando 2 threads parece ser o ideal, talvez até 1 SQ por thread.
Cujo
7 anos atrás #137102
Estou executando 4 instâncias do SQ neste momento nesta máquina (tirei a foto da tela há algum tempo, depois me distraí, mas ainda está em execução). Com o hack do Zulu e o material de linha de comando do tópico do Geektrader.
Não é super rápido, nem nada, mas funciona bem. Troquei de máquina no início do mês, na verdade fazendo downgrade, pois a última máquina era um exagero.
estatística
7 anos atrás #137325
Qual é o # ideal de instâncias do SQ3 que você executa por núcleo?
Eu faço 1 instância de SQ por núcleo e seu multithread, então faço 2 threads por SQ em meus antigos Dell Poweredges.
Existem programas ou scripts para gerenciar várias instâncias de software? Meu novo servidor tem 32 núcleos, o que significa 32 instâncias do SQ3, talvez 16, que provavelmente instalarei e executarei nele para obter velocidades ideais de geração de estratégias. Isso dá muito trabalho para alterar suas configurações e tudo mais se eu quiser que todas façam exatamente a mesma coisa.
Acredito que você tenha 16 núcleos reais / 32 threads. Eu tenho a mesma máquina (dois soquetes Xeon E5-2630), o SQ não pode usar mais de 4 núcleos reais, portanto, você pode usar 16 núcleos reais e executar 4 instâncias do SQ e ele carregará o 98%, mas você precisa otimizar o disco (SSD-PCI-X em RAID0 será suficiente)
Mesmo que você habilite 32 no SQ, não fará nenhuma diferença em relação a 4 threads. Testei extensivamente em diferentes máquinas e esse é o desempenho ideal; se você executar mais instâncias, elas estarão lutando pelo tempo de CPU e terão uma fila longa. Mas eu não verifiquei a quantidade de estratégias, apenas falo sobre a carga da CPU e a fila. Se você puder verificar a velocidade real de geração X estratégias/minuto. Acho que pode valer a pena descartar a fila da CPU.
Se você fizer esse teste, será útil para que eu possa fazer o mesmo:
Teste #1 Execute instâncias 1-2-3-4-x SQ para carregar a CPU 100% e meça quantas gerações foram criadas (use Random nesse caso; em média, o tamanho das estratégias será o mesmo.
Teste #2 Execute 1-2-3-4-x + 1-2-3-4 mais instâncias de SQ e meça quantas estratégias são geradas.
Espero que você execute o Server 2012 nessa máquina ou, pelo menos, o Windows 10.
Dessa forma, podemos descobrir qual é a melhor opção. Não apliquei nenhum hacks, pois não há necessidade, todos os núcleos reais estão totalmente carregados.
Vou aguardar seus resultados e depois publicarei os meus.
======
Cujo
Usar a nuvem é um desperdício de dinheiro, pois eles nunca lhe darão núcleos reais, mas sim vCPUs ruins que são de 4 a 10 vezes mais lentos que os núcleos reais. Opte por um servidor dedicado ou compre uma máquina E5 decente.
mentaledge
7 anos atrás #137331
Bem, a execução de várias instâncias proporcionará alguma paralelização do fluxo de trabalho, o que é útil quando quero dividir as coisas em um conjunto menor de blocos de construção.
Sou novo no SQ e o que me intriga é que, apesar do número de núcleos ou da própria máquina, a "CPU ocupada" não ultrapassa 50%.
Estou perdendo algo que impede o SQ de usar todos os recursos disponíveis?
estatística
7 anos atrás #137332
Bem, a execução de várias instâncias proporcionará alguma paralelização do fluxo de trabalho, o que é útil quando quero dividir as coisas em um conjunto menor de blocos de construção.
Sou novo no SQ e o que me intriga é que, apesar do número de núcleos ou da própria máquina, a "CPU ocupada" não ultrapassa 50%.
Estou perdendo algo que impede o SQ de usar todos os recursos disponíveis?
Leia minha resposta anterior sobre a máquina com 16 núcleos reais. Uma instância usa apenas 25% em todos os 16 núcleos (apesar da configuração para usar 16 núcleos e/ou 32Threads), portanto, decidi que são 4 núcleos. Eu uso outra máquina com 4 núcleos e o mesmo SET usa 98% de CPU. Acho que o Sq3 só usa no máximo 4x núcleos reais e 7GB de RAM (não 6GB como foi mencionado, mas 7GB (6,8GB)), o servidor tem 38GHz de potência de processador (threading nunca é contado, vem como um bônus), e eles são TODOS usados apenas com 4 instâncias, mas eu uso 6, apenas para ter certeza de que estou espremendo todo o suco dele, apesar da fila da CPU.
mentaledge
7 anos atrás #137333
Sim, eu entendi, o que eu quis dizer é que vejo a mesma carga baixa mesmo com 4 núcleos. Isso é para a fase de geração.
geektrader
7 anos atrás #137337
Minhas descobertas são de que 1,5 thread por instância é o ideal (cálculo teórico). Há um ano, descobri há muito tempo qual é o ideal. Como o valor é de 1,5 thread, estou mantendo 1 thread por instância, também porque a memória é duplicada ao mudar de 1 para 2 threads, mas o uso da CPU não é realmente duplicado (apenas ~1,6). Portanto, 1 thread por instância é o ideal para mim. A inicialização é feita por meio de um arquivo .bat que copia o SQ para X diretórios e, em seguida, inicia todos eles (é necessário fazer isso por meio da linha de comando "START blah.exe" do Windows a partir do arquivo .bat; caso contrário, o arquivo .bat é encerrado após a inicialização da primeira instância do SQ).
Exemplo de 4 instâncias (usando diretórios compactados via NTFS, se disponível, limpando temp/logs do SQ antes de copiar para que não sejam copiados, iniciando todos eles com prioridade BAIXA para que eu possa fazer outro trabalho e as instâncias do SQ usem apenas a quantidade de CPU que não está sendo usada no momento pelo meu trabalho normal diário, usando exclusion.txt para evitar a cópia do meu diretório /strategies/, pois ele é enorme e não precisa ser copiado para cada instância, pois posso simplesmente carregá-lo do diretório principal do SQ em cada instância):
@echo off rmdir "C:\Programa de Arquivos\StrategyQuant\temp" /S /Q rmdir "C:\Programa de Arquivos\StrategyQuant\log" /S /Q rmdir "c:\temp\strategyquant-temp" /S /Q mkdir "c:\temp\strategyquant-temp" mkdir "c:\temp\strategyquant-temp\1" mkdir "c:\temp\strategyquant-temp\2" mkdir "c:\temp\strategyquant-temp\3" mkdir "c:\temp\strategyquant-temp\4" compact /c /s: "c:\temp\strategyquant-temp\1" compact /c /s: "c:\temp\strategyquant-temp\2" compact /c /s: "c:\temp\strategyquant-temp\3" compact /c /s: "c:\temp\strategyquant-temp\4" c: xcopy "C:\Program Files\StrategyQuant" "c:\temp\strategyquant-temp\1" /E /Y /EXCLUDE:exclusion.txt CD "c:\temp\strategyquant-temp\1" start /LOW StrategyQuant64.exe -J-server -J-Xmx2500m -J-XX:+DisableExplicitGC -J-XX:+AggressiveOpts -J-XX:+UseSerialGC xcopy "C:\Program Files\StrategyQuant" "c:\temp\strategyquant-temp\2" /E /Y /EXCLUDE:exclusion.txt CD "c:\temp\strategyquant-temp\2" start /LOW StrategyQuant64.exe -J-server -J-Xmx2500m -J-XX:+DisableExplicitGC -J-XX:+AggressiveOpts -J-XX:+UseSerialGC xcopy "C:\Program Files\StrategyQuant" "c:\temp\strategyquant-temp\3" /E /Y /EXCLUDE:exclusion.txt CD "c:\temp\strategyquant-temp\3" start /LOW StrategyQuant64.exe -J-server -J-Xmx2500m -J-XX:+DisableExplicitGC -J-XX:+AggressiveOpts -J-XX:+UseSerialGC xcopy "C:\Program Files\StrategyQuant" "c:\temp\strategyquant-temp\4" /E /Y /EXCLUDE:exclusion.txt CD "c:\temp\strategyquant-temp\4" start /LOW StrategyQuant64.exe -J-server -J-Xmx2500m -J-XX:+DisableExplicitGC -J-XX:+AggressiveOpts -J-XX:+UseSerialGC
exclusion.txt contém apenas:
estratégias
que excluirá o diretório /strategies, conforme mencionado.
É claro que você também precisa ajustar a quantidade de RAM usada para cada instância, dependendo da memória do sistema. E o arquivo em lote pode ser facilmente estendido nos locais necessários para usar mais ou menos instâncias. Tenho arquivos bat para 2 a 21 instâncias.
Threshold
7 anos atrás #137338
Acredito que você tenha 16 núcleos reais / 32 threads. Eu tenho a mesma máquina (dois soquetes Xeon E5-2630), o SQ não pode usar mais de 4 núcleos reais, portanto, você pode usar 16 núcleos reais e executar 4 instâncias do SQ e ele carregará o 98%, mas você precisa otimizar o disco (SSD-PCI-X em RAID0 será suficiente)
Mesmo que você habilite 32 no SQ, não fará nenhuma diferença em relação a 4 threads. Testei extensivamente em diferentes máquinas e esse é o desempenho ideal; se você executar mais instâncias, elas estarão lutando pelo tempo de CPU e terão uma fila longa. Mas eu não verifiquei a quantidade de estratégias, apenas falo sobre a carga da CPU e a fila. Se você puder verificar a velocidade real de geração X estratégias/minuto. Acho que pode valer a pena descartar a fila da CPU.
Se você fizer esse teste, será útil para que eu possa fazer o mesmo:
Teste #1 Execute instâncias 1-2-3-4-x SQ para carregar a CPU 100% e meça quantas gerações foram criadas (use Random nesse caso; em média, o tamanho das estratégias será o mesmo.
Teste #2 Execute 1-2-3-4-x + 1-2-3-4 mais instâncias de SQ e meça quantas estratégias são geradas.
Espero que você execute o Server 2012 nessa máquina ou, pelo menos, o Windows 10.
Dessa forma, podemos descobrir qual é a melhor opção. Não apliquei nenhum hacks, pois não há necessidade, todos os núcleos reais estão totalmente carregados.
Vou aguardar seus resultados e depois publicarei os meus.
======
Cujo
Usar a nuvem é um desperdício de dinheiro, pois eles nunca lhe darão núcleos reais, mas sim vCPUs ruins que são de 4 a 10 vezes mais lentos que os núcleos reais. Opte por um servidor dedicado ou compre uma máquina E5 decente.
Não, tenho um r810 com 4 soquetes (4x x7560) = 32 núcleos, 64 threads. 128 GB de RAM, Windows Server 2008 Enterprise. O Windows 10 não pode usar 4 soquetes, e eu não gosto do sistema operacional.
Threshold
7 anos atrás #137373
Parece que a execução do SQ além de um determinado número de threads realmente afeta negativamente as velocidades de geração e as torna mais lentas.
Testei 1 SQ executando 64 threads só para ver o que acontece: As velocidades de geração vão de 0,2s normais por estratégia para cerca de 5-10s por estratégia. A carga da CPU ficou em torno do uso de 1-3%.
estatística
7 anos atrás #137379
Parece que a execução do SQ além de um determinado número de threads realmente afeta negativamente as velocidades de geração e as torna mais lentas.
Testei 1 SQ executando 64 threads só para ver o que acontece: As velocidades de geração vão de 0,2s normais por estratégia para cerca de 5-10s por estratégia. A carga da CPU ficou em torno do uso de 1-3%.
Obrigado pelo teste, ele confirma meu pensamento.
O verdadeiro teste será:
1. Crie uma pasta com 20.000 estratégias
2. Cloná-lo (para evitar quaisquer modificações do SQ)
3. Carga (comece com o consumo excessivo para evitar problemas com memória/disco/cpu) carga limpa
4. Teste de execução por 20 anos na M1 - tempo recorde
5. Limpe tudo, feche
6. Vá para a etapa #3, compare os resultados (repita #3 para cada combinação, com threads, sem hyper threading e somente núcleos etc.).
Isso está em minha lista de tarefas, mas se alguém puder executar esse teste e mostrar os resultados, seria útil.
Threshold
7 anos atrás #137390
@echo off rmdir "C:\Programa de Arquivos\StrategyQuant\temp" /S /Q rmdir "C:\Programa de Arquivos\StrategyQuant\log" /S /Q rmdir "c:\temp\strategyquant-temp" /S /Q mkdir "c:\temp\strategyquant-temp" mkdir "c:\temp\strategyquant-temp\1" mkdir "c:\temp\strategyquant-temp\2" mkdir "c:\temp\strategyquant-temp\3" mkdir "c:\temp\strategyquant-temp\4" compact /c /s: "c:\temp\strategyquant-temp\1" compact /c /s: "c:\temp\strategyquant-temp\2" compact /c /s: "c:\temp\strategyquant-temp\3" compact /c /s: "c:\temp\strategyquant-temp\4" c: xcopy "C:\Program Files\StrategyQuant" "c:\temp\strategyquant-temp\1" /E /Y /EXCLUDE:exclusion.txt CD "c:\temp\strategyquant-temp\1" start /LOW StrategyQuant64.exe -J-server -J-Xmx2500m -J-XX:+DisableExplicitGC -J-XX:+AggressiveOpts -J-XX:+UseSerialGC xcopy "C:\Program Files\StrategyQuant" "c:\temp\strategyquant-temp\2" /E /Y /EXCLUDE:exclusion.txt CD "c:\temp\strategyquant-temp\2" start /LOW StrategyQuant64.exe -J-server -J-Xmx2500m -J-XX:+DisableExplicitGC -J-XX:+AggressiveOpts -J-XX:+UseSerialGC xcopy "C:\Program Files\StrategyQuant" "c:\temp\strategyquant-temp\3" /E /Y /EXCLUDE:exclusion.txt CD "c:\temp\strategyquant-temp\3" start /LOW StrategyQuant64.exe -J-server -J-Xmx2500m -J-XX:+DisableExplicitGC -J-XX:+AggressiveOpts -J-XX:+UseSerialGC xcopy "C:\Program Files\StrategyQuant" "c:\temp\strategyquant-temp\4" /E /Y /EXCLUDE:exclusion.txt CD "c:\temp\strategyquant-temp\4" start /LOW StrategyQuant64.exe -J-server -J-Xmx2500m -J-XX:+DisableExplicitGC -J-XX:+AggressiveOpts -J-XX:+UseSerialGC
Você acha que isso é muito mais rápido do que carregar um arquivo de configurações "mestre" em cada um deles ou é menos trabalhoso?
Evitar a dor de cabeça provavelmente faz com que valha a pena por si só.
geektrader
7 anos atrás #137394
Sim, quero que tudo esteja correto e atualizado para cada instância, especialmente porque não quero atualizar os dados de 28 pares por semana em X instâncias. Além disso, os arquivos em lote têm alocação de RAM pré-configurada para o meu sistema e a quantidade de instâncias que são executadas a cada vez. Portanto, sei que está sempre correto. E, muitas vezes, executo 16 instâncias ao mesmo tempo, por exemplo, e aí fica até incômodo carregar o arquivo de configuração em cada uma delas. Com um SSD + eBoostr, toda a inicialização por meio dos arquivos .bat leva apenas 3 minutos ou menos.
Threshold
7 anos atrás #137397
Eu o executei ontem à noite e ele está definitivamente melhor.
Criei uma cópia separada da pasta "master bin". Antes de executar o lote, excluí da pasta bin todos os dados históricos que não usaria. Muito menos gigas copiados.
Threshold
7 anos atrás #137398
Média de uso de cerca de 80-85%. 32SQs com 2 threads cada. 64SQs com 1 thread cada teria sido muito trabalhoso.