- Partindo da tela do htop no Ubuntu Server 16.04 x64, acompanha via
/proce saídas de comandos o que uptime, load average, Tasks, PID, árvore de processos, estado, tempo de CPU, prioridade e métricas de memória realmente significam - Muitos valores da tela vêm do procfs e de arquivos do sistema como
/etc/passwd,/etc/group,/etc/shadowe/etc/nsswitch.conf; comstrace, é possível verificar quais arquivos o programa lê - Load average não é o mesmo que uso de CPU; é uma média móvel com decaimento exponencial que inclui processos em execução, processos aguardando para executar e processos em estado uninterruptible
- Códigos de estado como
R,S,D,Z,Tetestão ligados a signal,kille ao comportamento defork/exec/wait, servindo como pistas para entender por que um processo parou ou continua presente VIRT,RES,SHReMEM%mostram memória virtual, memória física e memória potencialmente compartilhável sob perspectivas diferentes, portanto é difícil concluir o uso real de memória olhando apenas um número
De onde vêm os valores do htop
uptimemostra há quanto tempo o sistema está em execução; a mesma informação também pode ser verificada com o comandouptime- O programa
uptimelê/proc/uptime- O primeiro número é o tempo total, em segundos, desde que o sistema foi ligado
- O segundo número é o tempo, em segundos, em que o sistema esteve em estado idle
- Em sistemas multicore, o tempo idle pode ser somado por núcleo e ficar maior que o uptime total
- Com
strace uptime 2>&1 | grep openoustrace -e open uptime, é possível ver os arquivos que ouptimeabre- A saída de exemplo inclui
/proc/uptime,/var/run/utmpe/proc/loadavg
- A saída de exemplo inclui
- Os números de
/proc/uptimesão convenientes para programas ou scripts, enquanto a saída deuptimeé formatada para leitura humana
Load average e uso de CPU
- Os três primeiros valores de
/proc/loadavgrepresentam o load average do sistema nos últimos 1 minuto, 5 minutos e 15 minutos - O quarto valor mostra o número de processos em execução e o número total de processos, como
1/120, e o último valor é o último PID usado - Ao executar um novo processo, um PID é atribuído; em geral, os PIDs aumentam e, quando se esgotam, são reutilizados
- O PID 1 pertence a
/sbin/init, iniciado durante o boot
- O PID 1 pertence a
- Se no
htopaparecer apenas um processo em execução, esse processo pode ser o própriohtop sleep 30não está em execução, mas em estado sleep, portanto não aumenta o número de running processes- Uma tarefa que usa CPU continuamente, como
cat /dev/urandom > /dev/null, aumenta o número de running processes e o load average - O load number é um valor que conta processos em execução ou aguardando para executar, além de processos em estado uninterruptible
- O load average não é uma média simples, mas uma média móvel com decaimento exponencial
- Mesmo o load average de 1 minuto não reflete apenas os últimos 60 segundos; ele dá mais peso ao último minuto, mas também inclui parte da atividade anterior
- Em um sistema com uma única CPU, se houver um processo CPU-bound, o load average
1.00pode ser simplificado como 100% de uso da CPU- Em um sistema de 2 núcleos, a mesma situação pode ser vista como 50% de uso da CPU
- Em um sistema de 2 núcleos, o load average correspondente a 100% de uso da CPU pode ser simplificado como
2.00
- Essa simplificação nem sempre é correta, porque processos em estado uninterruptible são incluídos no load
- Também é possível haver load average alto sem uso de CPU elevado
- O uso instantâneo de CPU pode ser verificado com
mpstatsudo apt install sysstat -ympstat 1
Tasks, PID e árvore de processos
- Tasks, no canto superior direito do
htop, mostra o número total de processos e o número de processos em execução - Internamente, o kernel Linux chama processos de tasks, e o
htopusa Tasks em vez de Processes para economizar espaço na tela - Com
Shift+H, é possível alternar a exibição de threads- Se aparecer algo como
Tasks: 23, 10 thr, as threads estão sendo exibidas
- Se aparecer algo como
- Com
Shift+K, é possível alternar a exibição de kernel threads- Se aparecer algo como
Tasks: 23, 40 kthr, as kernel threads estão sendo exibidas
- Se aparecer algo como
- Sempre que um novo processo é iniciado, um PID é atribuído
- Ao executar em segundo plano, como
sleep 1000 &, o número do job e o PID são exibidos $!nobashse expande para o ID do último processo em segundo plano
- Ao executar em segundo plano, como
- Informações relacionadas a processos ficam em
/proc/<pid>//proc/<pid>/cmdlinecontém o comando executado, e os argumentos são separados por bytes\0- É possível visualizar de forma legível com
tr '\0' '\n' < /proc/<pid>/cmdlineoustrings /proc/<pid>/cmdline /proc/<pid>/cwdé um link para o diretório de trabalho atual, e/proc/<pid>/exeé um link para o binário executado
- Ferramentas de diagnóstico como
htop,topepsleem detalhes dos processos em/proc/<pid>/<file> - Quem cria um novo processo é o parent process, e o processo recém-criado é o child process; essa relação forma a árvore de processos
- Ao pressionar
F5nohtop, é possível ver a hierarquia de processosps fepstree -atambém mostram a mesma relação
- Ao executar
datenobash, obashcria uma cópia de si mesmo comfork, carrega/bin/datena memória comexece, em seguida, obashparent aguarda o término do child /sbin/inité iniciado no boot e sobe osshd; ao fazer login por SSH, osshdcria o processo de sessão, e essa sessão executa o shellbash
Usuário e permissões de processos
- Cada processo pertence a um usuário, e o usuário é representado por um ID numérico
- É possível verificar o ID de usuário de um processo no item
Uidde/proc/<pid>/status - Um comando como
id 1000mostra o nome de usuário e os grupos correspondentes ao ID numérico idescolhe as fontes de resolução de nomes conforme a configuração de/etc/nsswitch.conf- No sistema de exemplo, ele lê
/etc/passwde/etc/group compaté o modo de compatibilidade e é igual afiles, mas permite entradas especiais- As informações de usuários também podem ser armazenadas em outros bancos de dados ou serviços, como LDAP
- No sistema de exemplo, ele lê
/etc/passwde/etc/groupsão arquivos em texto puro que mapeiam IDs numéricos para nomes legíveis por humanos- As informações reais de senha ficam em
/etc/shadow$6$indica o algoritmo de hashsha512- Depois disso vêm um salt aleatório para evitar ataques de rainbow table e o hash de password+salt
- Por padrão, programas são executados com as permissões do usuário que os executou
- Isso é igual mesmo que o proprietário do executável seja outro usuário
- Para executar como outro usuário ou como
root, usa-sesudosudo idé executado com o UID 0 deroot- É possível executar como um usuário específico, como em
sudo -u daemon id
- Ao tentar escrever diretamente em
/etc/sudoerscom redirect, apenas oechoé executado como root e o append é feito como o usuário atual, podendo falharecho "$USER ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoerssudo bash -c "echo '$USER ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers"
/etc/sudoersdeve ser editado comsudo visudo- Ele valida o conteúdo antes de salvar, evitando erros que possam deixar
sudoinutilizável
- Ele valida o conteúdo antes de salvar, evitando erros que possam deixar
/usr/bin/passwdconsegue escrever em/etc/shadowmesmo quando executado por um usuário comum- Como há um
snas permissões do arquivo, ele funciona como um executável setuid - É executado com as permissões de
root, o proprietário do executável - Executáveis setuid pertencentes a root podem ser encontrados com
find /bin -user root -perm -u+s
- Como há um
Códigos de estado de processos
- A coluna de estado do
htopaparece com o nomeS, e os principais valores são os seguintesR: running ou runnable, em execução ou aguardando na fila de execuçãoS: interruptible sleep, aguardando a conclusão de um eventoD: uninterruptible sleep, normalmente aguardando I/OZ: defunct zombie, encerrado, mas ainda não coletado pelo parentT: parado por job control signalt: parado por um debugger durante tracingX: dead, estado que não deveria aparecer
pstambém mostra substates comoSs,R+eSs+-
R: em execução ou executável
- O estado
Rindica que o processo está em execução no momento ou aguardando na fila de execução - O código-fonte de um programa, depois de compilado, vira instruções de CPU e, ao ser executado, é carregado na memória para que a CPU execute essas instruções
- Estar em execução significa que a CPU está executando fisicamente as instruções
- O estado
-
S: sleep interrompível
- No estado
S, as instruções do processo não são executadas pela CPU; ele aguarda um evento ou condição - Quando o evento ocorre, o kernel muda o estado para running
sleep 1000é um exemplo de espera por um tempo especificado- Esse estado pode ser interrompido por um signal
- No
htop, é possível enviar um signal pressionandoF9 killé uma chamada de sistema que envia um signal, e/bin/killé um programa em userland que chama essa funcionalidade- O signal padrão é
TERM, que solicita o encerramento do processo - Signals são números; seus nomes normalmente são escritos em maiúsculas e podem ter o prefixo
SIG - Exemplos:
INT,KILL,STOP,CONT,HUP kill -INT 10089,kill -2 10089e/bin/kill -2 10089fazem a mesma coisa- Ao pressionar
CTRL+C, obashenviaSIGINTpara o foreground process - Enviar
SIGINTouSIGTERMnão significa que o processo necessariamente será encerrado - Um programa pode definir um signal handler para fazer tarefas de limpeza e então encerrar
SIGKILLou9faz o kernel encerrar o processo à força, sem dar a ele a chance de responder
- No estado
-
D: sleep não interrompível
- O estado
Dnão pode ser acordado por signals; comoSIGKILLtambém é um signal, não é possível matar esse tipo de processo - Esse estado é usado quando o processo precisa esperar sem interrupção ou quando se espera que o evento ocorra rapidamente
- Exemplo: leitura/escrita em disco
- Um processo uninterruptible pode normalmente estar aguardando I/O após um page fault
- Esse estado pode ocorrer com atrasos de leitura e escrita em NFS
- Também pode aparecer quando há tão pouca memória disponível que o processo passa a fazer muito swap
- Como exemplo, ao executar
sudo mount 8.8.8.8:/tmp /tmp &,/sbin/mount.nfsfica no estadoD - Vendo com
strace, a chamada de sistemamountbloqueia o processo - Ao passar a opção
intrparamount, é possível executá-lo de forma interruptible sudo mount 8.8.8.8:/tmp /tmp -o intr
- O estado
-
Z: processo zumbi
- O estado
Zindica que o processo foi encerrado, mas o parent ainda não fez reap dele - Processos zumbis podem ser normais se existirem por pouco tempo
- Processos zumbis que permanecem por muito tempo podem indicar um bug no programa
- Um processo zumbi não consome memória, apenas ocupa um PID
- O processo zumbi em si não pode ser morto com
kill - É possível enviar
SIGCHLDao parent process para pedir que ele faça reap do zumbi - Ao matar o parent process, é possível remover o parent e seu zumbi
- É possível reproduzir o estado zumbi com um programa em C que, após
fork, faz o child chamarexit(0)e o parent chamarsleep(20) - Quando o parent termina, o zumbi desaparece
- O motivo de o zumbi ser mantido é que o parent precisa poder verificar o exit code do child pela chamada de sistema
wait
- O estado
-
T e t: processos parados
- O estado
Tindica que o processo foi parado por um job control signal - Ao pressionar
CTRL+Zdurante a execução decat /dev/urandom > /dev/null, ele entra no estadoT - É possível retomá-lo com
fg - Também é possível pausá-lo com o signal
STOPe retomá-lo com o signalCONT - O estado
tindica que o processo está parado enquanto um debugger faz tracing - Ao fazer attach com
sudo gdb -p <pid>a um processo executado comnc -l 1234 &, ele entra no estadot
- O estado
Tempo de CPU, niceness e prioridade
- O Linux é um sistema operacional multitarefa, então, mesmo em uma única CPU, vários processos parecem estar em execução ao mesmo tempo
- Na prática, uma única CPU só consegue executar uma instrução por vez, por isso usa time sharing
- Um processo é executado por um curto período e depois é interrompido
- Outros processos aguardando execução são executados em sequência
- O curto intervalo em que um processo é executado é chamado de time slice
- Como o time slice geralmente dura alguns milissegundos, isso quase não é perceptível se a carga do sistema não estiver alta
- Em um único núcleo, se o load average for
1.0, pode-se considerar que a CPU foi usada 100%- Se for maior que
1.0, há mais processos tentando executar do que a CPU consegue processar, o que pode causar slowdown ou delay - Se for menor que
1.0, a CPU fica ociosa em alguns momentos
- Se for maior que
- O motivo pelo qual o running time de um processo pode não ser exatamente igual ao tempo real decorrido também é explicado pelo time sharing
- Se houver mais tasks a executar do que CPUs core disponíveis, é preciso decidir qual task será executada primeiro
- O scheduler do kernel Linux escolhe o próximo processo na run queue, dependendo do algoritmo de scheduling do kernel
- Em geral, não é possível controlar diretamente o scheduler, mas é possível indicar quais processos são mais importantes
- niceness, exibido como
NI, é a prioridade em user-space- O intervalo vai de
-20a19 -20é a prioridade mais alta e19é a mais baixa- Pode-se entender que um processo mais nice cede mais espaço a processos menos nice
- O intervalo vai de
PRIé a prioridade em kernel-space usada pelo kernel Linux- O intervalo vai de
0a139 0~99é para real time, e100~139é o intervalo para usuários
- O intervalo vai de
- A relação entre o valor nice e a priority é explicada por
PR = 20 + NI-20~+19deNIvira0~39dePR, que é mapeado para100~139
- Antes da execução, a niceness é definida com
nice -n niceness program - A niceness de um processo em execução é alterada com
renice -n niceness -p PID - As cores de uso de CPU são as seguintes
- Blue: thread de baixa prioridade,
nice > 0 - Green: thread de prioridade normal
- Red: kernel thread
- Blue: thread de baixa prioridade,
Métricas de memória: VIRT, RES, SHR, MEM%
- Um processo parece existir sozinho na memória, e isso é implementado por meio de memória virtual
- Um processo não acessa diretamente a memória física; ele tem seu próprio virtual address space
- O kernel pode converter virtual memory address em physical memory ou mapear parte dela para o disk
- Por isso, um processo pode parecer usar mais memória do que a instalada no computador
- O uso de memória de um processo varia conforme inclui ou não os seguintes itens
- shared library
- disk-mapped memory
- swapped out memory
- As cores de uso de memória são as seguintes
- Green: used memory
- Blue: buffers
- Orange: cache
-
VIRT/VSZ
VIRTé a quantidade total de virtual memory usada pela task- Inclui code, data, shared library, swapped out page e pages mapeadas mas não usadas
- Mesmo que uma aplicação solicite 1 GB e use apenas 1 MB,
VIRTpode aparecer como 1 GB - Mesmo que um arquivo de 1 GB seja mapeado com
mmape não seja usado de fato,VIRTpode ser exibido como 1 GB - Na maioria dos casos,
VIRTnão é um número útil
-
RES/RSS
RESé a physical memory que não foi swapped out, ou seja, o uso de resident memory atualmente presente na memória físicaRESpode representar melhor o uso real de memória do queVIRT, mas tem limitações- Não inclui swapped out memory
- Parte da memória pode ser compartilhada com outros processos
- Se um processo usar 1 GB de memória e depois fizer
fork(), oRESdos dois processos pode aparecer como 1 GB cada, mas, devido ao copy-on-write do Linux, na prática apenas 1 GB pode estar sendo usado
-
SHR
SHRé a quantidade de shared memory usada pela task- Reflete a memória que pode ser potencialmente compartilhada com outros processos
- Um programa de exemplo em C mostra como os valores de
VIRT,RESeSHRmudam ao passar pormalloc, uso de parte da memória,forke escrita adicional na memória - A seção do exemplo de memória correspondente permanece como TODO
-
MEM%
MEM%é a proporção de available physical memory usada atualmente pela task- É o valor de
RESdividido pela RAM total - Ex.: se
RESfor400Me a RAM for 8 GB,400/8192*100 = 4.88%
Processos básicos do Ubuntu Server 16.04
-
Foram investigados os processos iniciados em um Ubuntu Server 16.04.1 LTS x64 de um droplet novo da DigitalOcean
-
/sbin/init/sbin/initcoordena o restante do processo de boot e configura o ambiente do usuário- Torna-se o processo pai ou avô dos processos iniciados automaticamente
- O resultado de
dpkg -S /sbin/initésystemd-sysv: /sbin/init, portanto nesse sistema trata-se do systemd - Nada acontece mesmo se for morto
-
/lib/systemd/systemd-journaldsystemd-journaldé um serviço de sistema que coleta e armazena dados de logging- Cria e mantém um journal estruturado e indexado com base em informações de log recebidas de várias fontes
- Em vez de arquivos de log simples em texto puro, usa um formato de arquivo especial otimizado para mensagens de log
- Consultado com
journalctl journalctl _COMM=sshdjournalctl _COMM=sshd -o json-prettyjournalctl --since yesterdayjournalctl -bjournalctl -fjournalctl --disk-usagejournalctl --vacuum-size=1G- Parece não ser possível removê-lo ou desativá-lo; apenas desligar o logging
-
/sbin/lvmetad -flvmetadfaz cache dos metadados do LVM para que comandos LVM leiam os metadados sem fazer varredura de disco- A varredura de disco leva tempo e pode atrapalhar as operações normais do sistema e do disco
- O LVM pode ser visto como “partições dinâmicas” que permitem criar, redimensionar e excluir volumes lógicos enquanto o Linux está em execução
- A conclusão é que, se você estiver usando LVM, deve mantê-lo
-
/lib/systemd/udevdsystemd-udevdescuta uevents do kernel e, para cada evento, executa as instruções correspondentes das regras udev- udev é o gerenciador de dispositivos do kernel Linux e gerencia principalmente os nós de dispositivo no diretório
/dev - Não há certeza se ele é necessário em um servidor virtual
-
/lib/systemd/timesyncdsystemd-timesyncdé um serviço de sistema que sincroniza o relógio local do sistema com um servidor NTP remoto- Substitui o
ntpd - No sistema de exemplo,
timedatectl statusmostra network time e NTP synchronized comoyes - Na saída do
netstat, apenas a porta SSH aparece em estado de listening; ele não abre várias portas UDP 123 como ontpddo Ubuntu 14.04
-
/usr/sbin/atd -fatdexecuta jobs colocados na fila para serem executados mais tardeatebatchleem comandos do stdin ou de um arquivo e os executam posteriormente- Diferentemente do cron, que agenda execuções recorrentes,
atexecuta uma vez em um horário específico - No exemplo,
echo "touch /tmp/yolo.txt" | at now + 1 minutecria um arquivo após 1 minuto - Se não for usado, remova com
sudo apt remove at -y --purge
-
/usr/lib/snapd/snapd- O Snappy Ubuntu Core é apresentado como uma versão do Ubuntu que usa atualizações transacionais
- snap é descrito como um formato universal de pacote Linux que permite que um único pacote binário funcione em desktops, servidores, cloud e dispositivos Linux
- Pode ser entendido como um pacote deb simplificado que agrupa dependências em um único snap para distribuição
- Como nunca foi feito deploy ou distribuição de aplicações com snappy no servidor, foi removido com
sudo apt remove snapd -y --purge
-
/usr/bin/dbus-daemon- D-Bus é um mecanismo de IPC e RPC entre vários processos executados simultaneamente na mesma máquina
- É necessário em ambientes desktop, mas fica a dúvida se é necessário em um servidor que executa uma web app
- Ao remover
dbus,timedatectl statusfalhou comFailed to create bus connection: No such file or directory - Por isso, a conclusão é que é melhor mantê-lo
-
/lib/systemd/systemd-logindsystemd-logindé um serviço de sistema que gerencia logins de usuários
-
/usr/sbin/cron -fcroné um daemon que executa comandos agendados-fsignifica foreground mode, sem daemonizar- Tarefas a serem executadas periodicamente podem ser agendadas com cron
crontab -e- A conclusão é que, no Ubuntu, costuma-se usar
/etc/cron.hourly,/etc/cron.dailyetc. - Os logs podem ser vistos das seguintes formas
grep cron /var/log/syslogjournalctl _COMM=cronjournalctl _COMM=cron --since="date" --until="date"- É bem provável que o cron seja mantido
- Se não for removê-lo, é possível parar e desativar com
sudo systemctl stop cron,sudo systemctl disable cron apt remove cronpode tentar instalar postfix etc.- Isso acontece porque o cron sugere um mail transport agent
-
/usr/sbin/rsyslogd -nrsyslogdé um utilitário de sistema que dá suporte a message logging- É responsável por preencher arquivos de log em
/var/log/, como/var/log/auth.log - Os arquivos de configuração ficam em
/etc/rsyslog.d - É possível configurar centralized logging enviando logs para um servidor remoto
- Com o comando
logger, scripts em background podem deixar mensagens em/var/log/syslog - Mesmo já havendo
systemd-journald, rsyslog e journal têm características diferentes, então pode ser útil usá-los juntos em certos cenários - Por isso, foi mantido por enquanto
-
/usr/sbin/acpidacpidé o daemon de eventos ACPI- Foi projetado para notificar programas em user-space sobre eventos ACPI
- ACPI é usado para descoberta/configuração de componentes de hardware, gerenciamento de energia, monitoramento de status etc.
- Como não havia intenção de suspender/retomar em um servidor virtual, foi testada sua remoção
rebootfuncionou, mas depois dehalta DigitalOcean ainda o reconhecia como ligado, então foi necessário usar Power Off pela interface web- Portanto, a conclusão é que é melhor mantê-lo
-
/usr/bin/lxcfs /var/lib/lxcfs/lxcfsé um filesystem FUSE projetado para containers LXC- Fornece uma visão virtualizada de alguns arquivos em
/proce acesso filtrado ao filesystem cgroup do host - Faz com que uptime, top etc. dentro do container tenham resultados mais “corretos”
- Se você não usa containers LXC, pode removê-lo com
sudo apt remove lxcfs -y --purge
-
/usr/lib/accountservice/accounts-daemon- AccountsService fornece uma interface D-Bus e uma implementação para consultar e manipular informações de contas de usuário
- A implementação se baseia nos comandos
usermod(8),useradd(8),userdel(8)
-
O que vai quebrar depois da remoção ficou como “Time will tell”
-
/sbin/mdadmmdadmé um utilitário Linux para gerenciar e monitorar software RAID devices- RAID é uma forma de usar vários hard drives como se fossem um só
- RAID 0 expande a capacidade dos drives
- RAID 1, RAID 5, RAID 6 e RAID 10 têm como objetivo evitar data loss em caso de drive failure
- Pode ser removido com
sudo apt remove mdadm -y --purge
-
/usr/lib/policykit-1/polkitd --no-debugpolkitdé o daemon do PolicyKit, e polkit é um Authorization Framework- Pode ser entendido como uma espécie de sudo com granularidade fina
- Permite conceder a um usuário sem privilégios o direito de executar ações específicas como root
- Exemplo: permitir reboot em um desktop Linux
- Em servidores, foi resumido que pode ser removido com
sudo apt remove policykit-1 -y --purge - O que vai quebrar ainda permanece como dúvida
-
/usr/sbin/sshd -Dsshdé o OpenSSH Daemon- A opção
-Dfaz com que ele não se desanexe e não vire daemon, facilitando o monitoramento
-
/sbin/iscsidiscsidé um daemon em background que opera conforme a configuração de iSCSI e gerencia conexões- iSCSI é um padrão de storage networking baseado em IP que transmite comandos SCSI por uma rede IP, permitindo usar storage remoto como se fosse um disco local
- Pode ser removido com
sudo apt remove open-iscsi -y --purge
-
/sbin/agetty --noclear tty1 linuxagettyé um getty alternativo para Linux- getty gerencia terminais físicos ou virtuais e, quando detecta uma conexão, exibe um prompt de nome de usuário e depois executa o programa
login - Na Digital Ocean, é possível interagir com esse terminal pelo navegador usando
Consolenos detalhes do droplet - Ao remover arquivos relacionados a
getty@tty1.servicee reiniciar, o acesso via SSH ainda era possível, mas não dava para fazer login pelo web console da Digital Ocean
-
Sessão SSH, bash, htop
sshd: root@pts/0significa que a SSH session do usuáriorootfoi configurada no pseudoterminalpts/0- Um pseudoterminal emula um terminal de texto real
bashé o shell em uso- Quando há um traço no início, como em
-bash, ele foi iniciado como login shell - Um shell cujo primeiro caractere do argumento zero é
-, ou que foi iniciado com a opção--login, é um login shell - Nesse caso, ele lê um conjunto diferente de arquivos de configuração
htopé o visualizador interativo de processos em execução no screenshot
Experimento de remoção de serviços
- A lista de remoção comum é a seguinte
sudo apt remove lvm2 -y --purgesudo apt remove at -y --purgesudo apt remove snapd -y --purgesudo apt remove lxcfs -y --purgesudo apt remove mdadm -y --purgesudo apt remove open-iscsi -y --purgesudo apt remove accountsservice -y --purgesudo apt remove policykit-1 -y --purge
- A edição Extreme inclui as seguintes tarefas
sudo apt remove dbus -y --purgesudo apt remove rsyslog -y --purgesudo apt remove acpid -y --purgesudo systemctl stop cron && sudo systemctl disable cronsudo rm /etc/systemd/system/getty.target.wants/getty@tty1.servicesudo rm /lib/systemd/system/getty@.service
- Uma configuração de nginx, PHP7 e MySQL seguindo as instruções de unattended installation of WordPress on Ubuntu Server funciona
Apêndice: ferramentas de investigação e comportamento do shell
-
Encontrando o código-fonte
- Quando apenas
stracenão é suficiente, é possível consultar o código-fonte - Encontre a localização do binário com
which uptimee o pacote do Ubuntu comdpkg -S /usr/bin/uptime - No exemplo,
uptimepertence ao pacoteprocps - Em packages.ubuntu.com, é possível pesquisar o pacote e encontrar o link do repositório de código-fonte
- Quando apenas
-
file descriptor e redirection
- Para redirecionar stderr para stdout, usa-se
2>&1 echo something > fileescreve stdout em file e é equivalente aecho something 1> fileecho something 2> fileescreve stderr em fileecho something 2>1significa redirecionar stderr para um filename chamado1- Em
2>&1, com&,1não é um filename, mas sim um stream ID
- Para redirecionar stderr para stdout, usa-se
-
Problema de cores no PuTTY
- Se elementos do
htopparecerem ausentes no PuTTY, isso pode ser resolvido nas configurações Window → Colours - Clique com o botão direito na title bar
- Change settings...
- Window → Colours
- Selecione Both radio button
- Apply
- Se elementos do
-
Um shell simples feito em C
- Um shell simples escrito em C demonstra o uso das chamadas de sistema
fork,execewait - Se a entrada for
exit, ele encerra como um built-in do shell - Outros comandos são executados com
execlpno child apósfork, e o parent aguarda o status de término comwaitpid - Exemplos executando
date,trueefalsemostram o exit code do child, respectivamente - A razão pela qual a mensagem de término de um background process como
sleep 1 &só aparece depois de pressionar Enter é que o shell fica aguardando input e verifica o status do background process quando um comando é inserido
- Um shell simples escrito em C demonstra o uso das chamadas de sistema
Itens restantes de investigação e histórico de correções
- Os itens que ainda se deseja investigar incluem process state substatus, kernel thread,
/dev/pts, memóriaCODE·DATA·SWAP, duração do time slice, algoritmo do Linux scheduler, core pinning, manual page, cores das barras de CPU/memory, limite de process ID e fork bomb,lsof,ionice,schedtooletc. - As principais correções e atualizações incluem o seguinte
- O idle time de
/proc/uptimeé a soma de todos os cores - Os
printfde parent/child no exemplo C de zombie foram corrigidos - Foi acrescentado que
apt remove crontenta instalarpostfixpor causa da dependência de MTA idpode carregar informações de outras fontes além de/etc/passwdpor meio de/etc/nsswitch.conf- Foi acrescentada a explicação do formato de password hash de
/etc/shadow /etc/sudoersdeve ser editado com segurança usandovisudo- Foi acrescentada a explicação de
MEM% - A seção de load average foi reescrita
- O signal padrão de
kill 1234foi corrigido deINTparaTERM - Foi acrescentada a explicação das color bars de CPU e memory
- O idle time de
1 comentários
Comentários do Hacker News
Recentemente migrei para o btop; a interface parece moderna e útil na medida certa, com informação suficiente
Como outras pessoas comentaram, aparentemente também mostra consumo de energia (Watts), além de rede, GPU e disco
https://github.com/aristocratos/btop
Não dá para desativar a barra de uso de disco, então, se a janela do console não for bem grande, o gráfico de velocidade de I/O fica bem espremido
Os gráficos de CPU/GPU ocupam espaço demais e, no geral, eu queria que a tabela de arquivos abertos tivesse mais espaço
Sempre mudo 2 configurações quando uso o htop, e a diferença é grande
Primeiro, desativo as threads de usuário. Em geral só poluem a tela do htop e quase não trazem informação útil
Segundo, ativo a visualização em árvore de processos. Muitas vezes é mais importante saber de onde um processo foi iniciado do que outras informações, e também fica mais fácil rastrear coisas como processos de compilador que consomem CPU enquanto processam muitos arquivos
Pessoalmente, acho que ambos deveriam ser o comportamento padrão do htop
É bom ver uma explicação de por que é difícil confiar na memória virtual. O modo como o Gerenciador de Tarefas do Windows mostra isso por padrão é péssimo
O resident set size (RSS) é o indicador mais confiável, e os outros valores podem ser inflados de forma enganosa por coisas como arquivos mapeados em memória, que na prática não causam problema
Por exemplo, mesmo que você mapeie em memória um arquivo de log de 2 GB, ele só será carregado em páginas quando essa parte for lida, então isso não significa uso real de memória, mas o usuário olha para o processo e diz “por que esse app está usando tanta memória?”
O Chrome também teve esse problema por um tempo e reduziu o uso de arquivos mapeados em memória, não porque arquivos mapeados em memória fossem ruins, mas porque os usuários reagiam exageradamente ao ver um valor que não representava o uso real de memória física
Também existem guias na web dizendo para avaliar uso de memória pela alocação de memória virtual, mas este texto ao menos acerta nessa parte
Referência: https://en.wikipedia.org/wiki/Proportional_set_size
Se usar I/O normal de arquivos, não entram. Em clusters HPC que monitoram o uso de memória de cada job e matam o processo se ele passar do solicitado, isso gera resultados bem curiosos
Quando começa a haver pressão de memória, ele deixa de ser representativo. Já vi decisões erradas por causa desse mal-entendido e até removi esse valor de um gráfico para impedir que um colega tirasse a conclusão errada
Como o nome sugere, ele mostra apenas a parte mapeada em memória física alocada privadamente para cada processo, sendo mais próximo do Resident Set no Unix
Você provavelmente estava falando do uso de memória na aba de desempenho, mas estou fazendo essa distinção porque isso pode ser entendido como se valesse para todos os itens de uso de memória
No top, usar o caractere
>faz a ordenação por uso de memóriaÀs vezes uso isso quando estou procurando por que o host ficou lento, e dá para ver até o
swapdconsumindo CPUMmaiúsculo para memória ePmaiúsculo para CPULer textos assim me faz perceber que, mesmo usando Linux todos os dias há mais de 20 anos, eu ainda só aproveito uma parte do potencial. Ótimo texto
Parece que o HN está voltando a se recuperar
Espero que este não seja o período fantasma ambulante do HN
Para quem não conhece o
nmon, também vale a pena dar uma olhadaSe você apertar
h, aparece a lista de monitores disponíveis; apertando de novo, ela some, eqsai do programahttps://nmon.sourceforge.io/pmwiki.php
Especialmente o throughput de disco e I/O vistos com as teclas
deDsão bem úteisO gráfico largo de uso de CPU lida muito bem com grandes quantidades de núcleos, o que é ótimo
Em vez da forma de uso dos utilitários da família
*top, passei a preferir relatórios diferenciais mais tranquilos no estilopse relatórios do sistema inteiro como ovmstatAssim, tudo fica preservado no buffer de rolagem do terminal: https://github.com/c-blake/procs
Foi escrito em Nim, uma linguagem incomumente eficiente e expressiva
Tenho este texto salvo nos favoritos desde 2016 e voltei a consultá-lo várias vezes ao longo dos anos