Digamos que eu tenho 20 usuários conectados na minha caixa Linux. Como posso saber quanta memória cada um deles está usando?
20
Você pode tentar usar o smem (consulte ELC2009: Visualizando o Uso da Memória com o Smem para obter mais informações). Em particular, sudo smem -u
deve fornecer as informações que você deseja.
--no-install-recommends
.Ignorando problemas de memória compartilhada, aqui está um script rápido que fornece RSS e VMEM para todos os usuários conectados, classificados por vmem e organizados em colunas atraentes:
fonte
Para obter a soma do RSS, acho que o seguinte funciona. Seria obter a soma do RSS para os usuários kbrandt e root.
fonte
Essa é uma pergunta complicada. Você poderia facilmente resumir os valores totais de troca de RSS + na saída "ps", mas e a memória compartilhada? Usuários diferentes podem compartilhar facilmente a mesma página de código se estiverem executando o mesmo processo. Para quem você considera isso? E os buffers e cache? Realmente depende da precisão que você deseja que seus resultados sejam. Quanto mais preciso você quiser, mais difícil será.
fonte
Não tenho certeza de como relatar o uso de memória pelo usuário, mas se você estiver preocupado em controlar o uso deles, deve procurar ulimit. Isso permitirá que você defina limites rígidos e flexíveis por usuário / grupo para memória e outros recursos em seu sistema.
fonte
Você pode tentar algo como:
fonte
ps aux | grep mysql | awk '{memory +=$4}; END {print memory }'
, onde o mysql poderia ser substituído pelo nome de um usuário ou processo.Procurando o mesmo, descobri isso
para imprimir processos ordenados por mem, agrupados por usuário (coluna1, $ 1), você pode agrupar por outras coisas e somar outras, alterando $ 1 e $ 4
Fiquei feliz em encontrar a solução, só queria compartilhar.
fonte
ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2
. O comando de classificação precisa do-n
sinalizador para analisar a memória como um número. Dessa forma, você também pode substituir a palavra "usuário" por "comando" para agrupar pelo nome do aplicativo.Esse script do bash provavelmente é feio como o inferno, mas obrigado pelo exercício, meu bash estava (está) ficando enferrujado!
Resultado:
Comente / corrija e atualizarei a resposta. Também uso a saída de memória rss do PS, como outros discutiram, há prós / contras no uso desse valor.
fonte
O smem não estava disponível no meu sistema, e o script de Dave não funcionou por algum motivo, então escrevi este feio onliner do Perl para processar a saída do ps:
Observe que alguns usuários foram identificados usando o UID em vez do nome de usuário. Você pode lidar com isso analisando nomes de usuários em / etc / passwd, usando o mais feio:
fonte
Usando script Bash
SAÍDA
fonte
Você pode obter os UIDs
/etc/passwd
para fazer isso para todos os usuáriosfonte
Bem, neste estado do kernel Linux, posso pensar em apenas uma maneira adequada de realizar essa tarefa - usando cgroups de memória. Você precisaria colocar um usuário no login no próprio cgroup, e isso pode exigir o desenvolvimento do próprio módulo pam ou (melhor) modificar o módulo existente para isso.
Um documento útil para ler sobre isso é: Guia de Gerenciamento de Recursos da RedHat®.
fonte