Como posso acessar os dados do tempo de roubo no Solaris SunOS 5.10

1

Acho que a versão do Solaris que estamos executando é muito antiga para relatar o tempo de roubo na parte superior. Existe uma maneira de obter essas informações nesta versão mais antiga do Solaris. Aqui está a informação básica da versão:

-bash-3.2$  uname -aX
SunOS sekritname 5.10 Generic_150400-59 sun4v sparc sun4vSystem = SunOS
Node = sekritname
Release = 5.10
KernelID = Generic_150400-59
Machine = sun4v
BusType = <unknown>
Serial = <unknown>
Users = <unknown>
OEM# = 0
Origin# = 1
NumCPU = 32

Eu não tenho nenhum conhecimento real sobre esses sistemas Sun VM, então posso estar entendendo mal as coisas e pode haver uma maneira melhor de fazer o que eu preciso nessa situação. Aplicando o meu modelo mental da Intel, suspeito que estamos ficando lotados da CPU, mas como posso medir isso?

Atualizar

Perdoe a terminologia Intelish. Basicamente, executamos duas VMs em um único blade, em que uma é um servidor de aplicativos e a outra fornece suporte a SSO do aplicativo. Temos momentos em que o servidor de aplicativos diminui significativamente e também temos momentos em que o aplicativo SSO de terceiros é ativado nas ervas daninhas.

Também há silos e política envolvidos, por isso não tenho visibilidade do host de SSO ou da camada de hardware real.

Minha hipótese operacional atual é que quando o aplicativo SSO enlouquece, ele ocupa tanto a CPU que o servidor de aplicativos não consegue obter tempo de computação real o suficiente para acompanhar a carga. Analisei os logs do GC do aplicativo e uma coisa que se destacou foram entradas como esta:

[Times: user=0.71 sys=1.36, real=1.47 secs]

Isso ocorre com 10 encadeamentos paralelos de trabalho do GC, normalmente user >> real >> sys e uma causa do padrão de horário ímpar é uma VM em que você não consegue obter CPU suficiente. (Não estamos trocando e os sistemas são todos baseados em SSD, portanto, esperas de IO não são um problema.)

Neste ponto, eu preciso de dados para ajudar a provar esta teoria, e na minha mente Linux eu iria apenas verificar o st% no topo. Googling também diz que na versão moderna do Solaris eu poderia fazer a mesma coisa. Meu problema é que não estamos executando essa versão moderna do Solaris.

    
por Ukko 20.03.2018 / 15:10

1 resposta

1

Seu verdadeiro problema aqui parece ser sua lentidão no desempenho. E roubar-tempo provavelmente não faz sentido em um servidor Solaris 10 T1000 / T2000.

Para descobrir se você está executando em uma zona, use o comando /usr/bin/zonename (o local pode ser diferente em versões diferentes do Solaris - verifique também /bin , /sbin/ e /usr/sbin ).zonename retorna algo diferente de global , você está executando em uma zona.

Se, por algum motivo, você não tiver acesso ao comando zonename , existem vários comandos ps que podem ser usados para ver se você está em uma zona. Primeiro, procure por init :

ps -ef | grep init

Se isso não localizar um processo init com um PID de 1 , você estará em uma zona. Você também pode procurar por zsched (IIRC):

ps -ef | grep zsched

Se isso retornar um processo que é seu próprio pai (tanto o PID quanto o PPID são iguais e maiores que 1 ), então você está executando em uma zona.

Se você estiver em uma zona, poderá estar encontrando limitações de recursos que diminuem sua velocidade. Não é provável que seja esse o caso.

O que else está sendo executado no servidor? Incluindo outras zonas. Tenho visto problemas de desempenho realmente desagradáveis nos servidores da série T semelhantes ao que você está descrevendo, causados por interações entre o ARC do ZFS e aplicativos que usam páginas de memória enormes - como um banco de dados Oracle.

O ZFS ARC usa 4k páginas de memória, por isso fragmenta a memória - e fragmentará ALL a memória em seu servidor. Se o seu servidor entrar nesse estado e um processo exigir uma quantidade significativa de grandes páginas de memória, o kernel terá que aglutinar um monte de páginas pequenas em grandes, o que envolve a movimentação de muita memória. E tudo é feito com um único thread. E qualquer encadeamento único em um servidor T-series antigo é LENTO porque os servidores foram projetados para lidar com um grande número de encadeamentos com grandes latências - como um servidor da Web ou de banco de dados que manipula muitas conexões através de uma rede.

Assim, o kernel entra em longos períodos em que tudo o que faz é juntar pequenas páginas de memória em páginas grandes.

Em seguida, o ZFS ARC recupera as páginas depois que o processo de uso de páginas grandes é feito com elas e elas ficam fragmentadas.

Eu suspeito que você esteja tendo exatamente o mesmo problema.

Para descobrir, corra

echo ::memstat | mdb -k

como root, na região global, se você estiver executando zonas. Se a sua memória livre é muito baixa, você pode estar com este problema.

Para descobrir, execute o script dTrace a seguir, novamente como raiz da região global para determinar onde o kernel está gastando todo o seu tempo:

#!/usr/sbin/dtrace -s

profile:::profile-1001hz
/arg0/
{
    @[ stack() ] = count();
}

Copie isso para um arquivo, diga hot.d , configure-o como executável ( chmod 755 hot.d ) e execute-o como raiz na região global:

./hot.d

Execute-o quando estiver com lentidão. Deixe-o funcionar por uns bons 10 a 20 segundos, se não mais, depois que ele emite matched 1 probe e, em seguida, divida-o com CTRL-C . Em seguida, ele emitirá um lote de saída, a maioria dos quais você não se importa. O último punhado de saída de rastreios de pilha, no entanto, serão os mais comuns amostrados, o que lhe dirá onde o kernel está gastando todo o tempo.

Isso lhe dirá definitivamente onde está seu problema. Pode não ser preciso o suficiente para resolvê-lo completamente e você pode precisar fazer mais investigações, mas saberá onde procurar.

Se você vir muitos rastreios de pilha com idle ou wait , você tem um problema de espaço do usuário. Você pode identificar isso substituindo stack() no script dTrace acima por ustack() para obter a pilha de usuários.

E se você estiver vendo muitos rastreios de pilha com coalesce nos nomes das funções, o kernel está gastando todo o tempo criando grandes páginas de memória. A solução para isso é liberar memória, provavelmente limitando o tamanho do ARC do ZFS, talvez até severamente. Eu tive que kneecap o ARC do ZFS em alguns servidores, abaixo de 1 GB, para parar de matar o desempenho.

    
por 21.03.2018 / 15:55