Liens
Versions et nouveautés (news, release notes)
Docs noyau
Actu / articles
Livres/bouquins
Docs
Sources
- kernel.org (the kernel archive - sources, patchs, git,
changelog, dernier noyau stable, mailing-lists, etc.)
- lxr.linux.no (naviguer dans les sources de toutes les versions du noyau Linux)
- Docs LDP
- paquet : linux-source-x.x.x
Wikipédia
|
Infos techniques
Infos : voir Debug - récolte infos
Paramètres noyau
Boot - démarrage
PM QoS (Quality Of Service) Interface
Timers
Configuration du noyau Linux (fichier .config)
Compilation du noyau Linux
Versions du noyau Linux
- Versions : infos fr
- 3.8 : Les microprocesseurs i386 ne sont plus supportés à partir de cette version
- 3.7 : supporte ARM et le SecureBoot (plus d'infos)
|
Optimiser les ressources du noyau
Versions du noyau & améliorations notables
Optimisations autres que celles du noyau
Tutos/articles/doc/howto
- Algorithmes
- CFS, un O(log N), auquel a
participé Ingo Molnár,
est utilisé à partir du noyau Linux 2.6.23. Le scheduler O(1)
était utilisé dans les versions précédentes 2.6.
- etc.
- Tutoriels : Linux
2.6 IO Performance Analysis, Quantification, and Optimization, tutos SSD
- Dans la plupart des distributions GNU/Linux récentes, le I/O scheduler défini par défaut est CFQ (qui peut/devrait être avantageusement remplacé par BFQ
- Comparaison
entre bfq, cfq, deadline, et loop
- Pour un serveur de base de données
- basculer sur le I/O scheduler deadline
permet de meilleures performances dans certains cas.
- le I/O scheduler noop
est également plus performant que cfq dans certains cas. A utiliser avec les SSD. A utiliser dans le cadre d'un serveur
virtualisé, ce qui permet de tirer profit du I/O scheduler de la machine hôte (qui pourrait être par exemple
"deadline").
- Modifier dynamiquement le I/O scheduler, par exemple pour sda :
- vérifier le I/O scheduler utilisé (c'est celui qui apparaîtra entre crochets)
# cat /sys/block/sda/queue/scheduler
# cat /sys/block/cciss?c0d0/queue/scheduler
- basculer vers le I/O scheduler "deadline"
# echo "deadline" > /sys/block/sda/queue/scheduler
$ echo deadline | sudo tee /sys/block/sda/queue/scheduler
- Modifier le I/O scheduler pour les "reboot" ultérieurs
- dans le fichier de config de grub (/boot/grub/grub.cfg, grub.conf,menu.lst), ajouter à une
entrée noyau le paramètre
elevator=deadline , et rebooter sur ce noyau.
Modification de paramètres noyau lors de sa compilation
- Plus d'infos
- Ex : optimisation au niveau périphs (d durs)
- # Generic PCI (IDE chipset & Bus Master DMA) support
# Use DMA by default
Modification de paramètres noyau dynamiquement, par /proc
- Ex au niveau thread : modifier
threads-max
Modification de paramètres noyau par sysctl
Modification dynamique
- mettre les paramètres à modifier dans un fichier "modifs", et exécuter :
Modification statique (active pour les "reboot" ultérieurs)
- Tutos
- Tutos sécurité
- Procédure (autre exemple)
- vérif : # sysctl -a
- ajouter à /etc/sysctl.conf (ou aux fichiers du dossier /etc/sysctl.d) les paramètres voulus, ou les
y modifier
- Ex, pour un ordinateur avec 6 Go de mémoire, dans /etc/sysctl.conf :
- kernel.shmall = 1495122 (taille
mémoire physique / taille page mémoire)
kernel.shmmax = 3062009856 (taille
mémoire physique / 2)
- prise en compte de la modif : # sysctl -p
Optimisation noyau pour les bases de données PostgreSQL
-
Optimisation noyau pour les bases de données Oracle (pour
DB2)
- Vérification des limites
(# ipcs -l) et de l'usage (# ipcs -a)
- Si nécessaire, modifier les limites des paramètres suivants
- vérif : # sysctl -a
kernel.shmmax = ....... ( recommandé : moitié de la mém vue par : $ free -b)
kernel.sem = 250 32000 100 128
kernel.sem = semmsl semmns semopm semmni
- modif, à ajouter/modifier dans /etc/sysctl.conf :
kernel.sem = 250 256000 100 1024
- prise en compte de la modif : # /sbin/sysctl -p
- Notes
- kernel.shmmax = taille max (en octet) du segment de mémoire partagée
- kernel.sem = paramètres sémaphores de /proc/sys/kernel/sem :
- semmsl : nb max de sémaphores par tableau
- semmns : nb max de sémaphores système (semmns = semmsl * semmni)
- semopm : nb max d'ops par appel semop
- semmni : nb max de tableaux (d'identifiants de sémaphores) - semaphore ID limit
|
Paramètres - options de boot
Lors du boot, des paramètres (ou options) peuvent être passés au noyau Linux vmlinuz,
par exemple au niveau du fichier de configuration de grub.
Logs du boot
Voir les paramètres du noyau Linux qui ont été utilisés au boot
- $ cat /proc/cmdline
- Ou : voir dans /boot/grub/grub.cfg (ou menu.lst) les paramètres qui suivent vmlinuz
Liste et description de ces options
- sur le web
- sur le disque dur, la doc. noyau est listée dans le fichier 00-index, dans /usr/share/doc/linux-doc etc.
- /usr/share/doc/linux-doc/kernel-parameters.txt (paquet linux-doc) - Ubuntu, etc.
- /usr/share/doc/kernel-doc-x.x.xx/Documentation/kernel-parameters.txt (paquet kernel-doc) - RHEL, etc.
- /usr/src/linux/Documentation/kernel-parameters.txt
- /usr/src/linux-source-2.6.38/Documentation/kernel-parameters.txt ( SLES, etc.)
- /usr/src/linux-source-2.6.38/Documentation/x86/x86_64/boot-options.txt (SLES 64bit, etc.)
- /usr/src/linux-source-2.6.38/Documentation/x86/x86_64/machinecheck (concernant
le comportement face à des erreurs hardware, affichables par la commande mcelog)
Quelques options
- acpi=off (peut
solutionner un pb de boot, mais risque de désactivation des ventilateurs)
- apm=on (pour activer le pilote APM, note : APM est de + en + remplacé par ACPI)
- boot_delay=1000 (laisse le temps de faire une photo d'écran en cas de crash au boot)
- elevator=deadline (choix de cet ordonnanceur E/S)
- mce=ignore_ce (désactive mcelog,
au cas où la carte mère surveillerait déjà les défaillances RAM)
- quiet (évite l'affichage des détails du boot)
- reboot=b[ios] | s[mp] | t[riple] | k[bd] | e[fi] [, [w]arm | [c]old] | p[ci] | f[orce]
- selinux=0 (désactive SELinux)
- vga=1, ou vga=791 (permet l'affichage d'un + grand nb de lignes, utile en cas de besoin de photo
d'écran)
- vconsole.keymap=us
- vconsole.font=
|
|
Multi-coeurs
- le noyau Linux SMP le supporte
- certaines applis les utilisent
|
Linux, optimisation et temps
réel
cset, cpuset
C-states (C0, C1, etc.), P-states, T-states
T-states : Thermal states.
P-states : fréquences du microprocesseur.
2 types de C-states : les C-states ACPI BIOS (pilote Linux acpi_idle), et les C-States (ou C-modes) du microprocesseur (pilote
Linux cpuidle ou intel_idle).
Les extensions C-states et MWAIT du microprocesseur peuvent être utilisées par le s.e. pour réduire la
consommation d'énergie (suivant le niveau du C-state, certains éléments du microprocesseur peuvent être au
repos (non-alimentés) ou la tension peut être baissée). Inconvénient : temps de latence lors de la transition
d'un C-state à un autre. C0 est le mode 100% opérationnel (C0 = perf. max, car C1, C2, etc. vont entraîner une
consommation d'énergie réduite mais également des temps de latence).
Vérif
- $ dmesg | egrep "idle|C-state"
- $ egrep "idle|C-state" /var/log/messages - pour RHEL, SLES, etc. (/var/log/syslog pour Ubuntu)
- $ cat /proc/acpi/processor/CPUx/power (x = n° du coeur) - affiche "active state",
"max_cstate", "maximum allowed latency", les temps de latence, etc.
- $ find /sys/devices/system/cpu/cpu0/cpuidle -name name -o -name latency | xargs cat - affiche les
C-states avec leur temps de latence en microsecondes)
- $ cd /sys/devices/system/cpu/cpu0/cpuidle/statex ; for i in `ls` ; do echo $i: ; cat $i ; done (x
= n° du C-states)
- $ acpitool -c
- $ turbostat affiche les
fréq. (+ basses ou + hautes (turbo-boost)) et des statistiques concernant les C-states (statistiques idle)
Réglages statiques (au reboot) du C-state, par les paramètres
du
noyau Linux
- intel_idle.max_cstate (si à 0, désactive les C-states du microprocesseur et active les C-states
ACPI)
- processor.max_cstate (C-state ACPI)
Réglages dynamique (sans reboot) du C-state
- par la commande cpupower
- par des programmes du paquet tuned (RHEL 6 et +)
Embarqué
Liens
Fréquence(s)
- HZ : Internal kernel timer frequency (The frequency the system timer interrupt pops).
- Robert Love explique la variable HZ
- HZ=100 : ok pour serveurs
- interrupt toutes les 10 ms (1/100e de s.)
- uptime wraparound (jiffies wraparound) : tous les 497 jours.
- HZ=1000 : ok pour PC de bureau (musique, vidéo, etc.)
- interrupt toutes les 1 ms (1/1000e de s.)
- ++ préemption + rapide
- - - risque de overhead (car 10x plus d'interrupts qu'avec HZ=100) => mais pas de pb sur ordinateurs rapides...
- - - uptime wraparound (jiffies wraparound) : tous les 49,7 jours, ce qui peut poser pb.
- note : est-ce cela qui est défini dans linux-rt et linux-headers-rt ?
- HZ est défini ((par CONFIG_HZ)) dans le fichier de config du noyau Linux, ou dans le module config_hz_info.c.
- A partir de la version du noyau Linux 2.6.13, HZ est passé de 250 à 1000 sur certaines distrib. (ex : RHEL).
- Configuration & infos
- CONFIG_HZ : permet à un utilisateur de modifier la valeur de HZ.
- Dans /usr/src/linux.../kernel : Kconfig.hz et time/Kconfig
- Dans /usr/src/linux.../.config
- Vérification
- # grep HZ /boot/config-`uname -r`
- CONFIG_HZ=250 (sur Ubuntu 11.04 et 10.10 32 bits).
- # getconf CLK_TCK (correspondrait à USER_HZ)
- = 100 sur Ubuntu 11.04 et 10.10 32 bits.
- Shell-script
- #!/bin/bash
while [ 1 ] ; do
A=`cat /proc/interrupts | grep "timer interrupts" | cut -d ':' -f 2 |sed -e 's/[^0-9]//g'` ; sleep 1 ; B=`cat /proc/interrupts
| grep "timer interrupts" | cut -d ':' -f 2 |sed -e 's/[^0-9]//g'` ; C=$(($B-$A)) ; echo "$C HZ"
done
Différencier la configuration "noyau" de celle des applications
- Noyau
- Applications & temps réel
PTP
PTP (Precision Time Protocol) est un protocole distribué (au niveau LAN) d'horloges synchronisées (au 10e de
micro-seconde, donc PTP est beaucoup plus précis que NTP). La synchronisation se fait tout au long de la chaîne, au niveau
logiciel (s.e. RHEL 6.5, etc.), et au niveau matériel (NIC, switchs, etc.).
Domaines d'applications : trading, etc.
NTP
$ cat /var/lib/ntp/ntp.drift
Tracing du noyau & des processus (IRQ, wakeup, etc.)
Infos & liens"Linux temps réel"
Le "temps réel" est en fait une prédictabilité de temps de réponse.
- Articles
- Infos
- Fedora
- Red Hat
- Ubuntu
- Applications
- FreqTweak
- Logiciel permettant de manipuler un spectre audio en temps réel
- Sous Ubuntu 10.10, lors de l'installation de ce package, il est demandé de cocher pour activer l'audio temps
réel, et ce texte d'aide est affiché :
- "Si vous voulez exécuter jackd avec des priorités en temps réel, l'identifiant qui exécute
le démon doit avoir des autorisations « realtime ». Vous pouvez choisir cette option pour créer
un fichier /etc/security/limits.d/audio.conf qui donnera la priorité « realtime » et le
privilège « memlock » (verrouillage de la mémoire) au groupe « audio »."
- "Si jackd est exécuté en priorité temps réel, les délais de latence seront
diminués mais cela peut provoquer un gel complet du système si toute la mémoire physique du
système est mobilisée, ce qui est difficilement acceptable en environnement multi-utilisateurs."
- Rosegarden
- Infos affichées au lancement de Rosegarden :
- ...essayez d'entrer sudo modprobe snd-rtctimer dans une fenêtre
terminal, puis de redémarrer Rosegarden.
|
kernel tainted (gâté, infecté, souillé)
Un noyau "tainted" indique qu'un module a une licence non-GPL, ou qu'il y a (eu) un problème: une erreur noyau, un "hang", etc.
Vérifications
- $ cat /proc/sys/kernel/tainted (si cette commande affiche une autre valeur que 0 => kernel
tainted)
- $ dmesg | grep -i taint
Plus d'infos
Debug - récoltes infos
Voir aussi debug.htm
Docs - articles
Packages à installer
- # yum install kernel kernel-devel debuginfo-install systemtap yum-utils
Logs
- # dmesg
- Fichiers du dossier /var/log : messages, dmesg, dmesg.0, dmesg.1.gz, boot, boot.log, bootstrap.log
Infos noyau (boot, config, driver, module, etc.)
Scripts de récupération d'infos
Config du noyau Linux
- Infos
- Fichier de configuration des sources
- /usr/src/linux/.config
- /usr/src/kernels/$(uname -r)/.config (RHEL, etc.)
- Paramètres noyau
- Configuration du noyau en activité
- Fichier de configuration : /boot/config-$(uname -r)
- Ex : vérification du support par le noyau d'initrd et de loopfs
- $ grep -E "CONFIG_BLK_DEV_INITRD|CONFIG_BLK_DEV_LOOP" /boot/config-$(uname -r)
- /proc
- Ex : vérifier la valeur de threads-max (et éventuellement la modifier)
- # cat /proc/sys/kernel/threads-max
Infos des drivers présents sous la forme de module
Infos
- cat /proc/modules
- depmod -n `uname -r`
Infos par lsmod et modinfo
- for i in `lsmod | awk '{print $1}'` ; do echo "=== $i" ; modinfo $i | grep -E
"version:|vermagic" ; done (version)
- for i in `lsmod | awk '{print $1}'` ; do echo "=== $i" ; modinfo -n -k `uname -r` $i ;
done (localisation des binaires)
Ex : périph CD/DVD et driver associé
# lsmod | grep -E 'cd|dvd'
cdrom ... sr_mod
# modinfo sr_mod
filename: .......sr_mod.ko
description: SCSI cdrom (sr) driver
Ex : module NFS
- # lsmod | grep nfs && modinfo nfs
- # cat /sys/module/nfs/srcversion
- # ls -l /lib/modules/3.2.0-26-generic/kernel/fs/nfs
Infos des drivers intégrés au noyau, et leur configuration
- Ex : recherche de driver NFS
- # grep -i nfs /boot/config-$(uname -r)
- # grep -i _nfs /usr/src/linux/.config
- # grep -i _nfs /usr/src/linux-headers-`uname -r`/.config (Ubuntu)
- # grep -i nfs
/usr/src/kernels/......./.config
(RHEL)
- # gzip -cd /proc/config.gz | grep -i
nfs
((Mandriva))
Drivers tiers
- $ jockey-gtk (gestion des drivers tiers (AMD, nVidia, réseau wifi, etc.))
Mes autres infos "drivers, firmwares"
|
Le noyau Linux supporte kdb et kgdb
à partir de la version 2.6.26-rc1.
Infos et liens
Tracing
Dumper / crash dump avec kdump
- tutos/docs
- création automatique de dump
- installer le paquet linux-crashdump
- pour activer le mécanisme de capture de vmcore en cas de crash, ajouter le paramètre crashkernel à vmlinuz dans /boot/grub/grub.cfg :
- exemple :
crashkernel=384M-2G:64M,2G-:128M
- création d'un kdump
- Installation : $ sudo apt-get install crash kexec-tools libdw1 makedumpfile linux-crashdump (Ubuntu
12.04)
- Utilisation
- # service kdump status (vérifie que le service kdump est activé)
- SysRq
- makedumpfile permet d'éliminer certains
éléments du fichier dump et de le compresser (voir : $ man
8 makedumpfile)
- analyse de crashdump
Debug
- kdb : local debugger
- kgdb : remote debugger
Commencer un debug, par exemple avec kdb
- # echo g > /proc/sysrq-trigger
|
Mécanisme "Magic SysRq" (ou Sys Rq, System request)
Docs : SysRq et "command keys", Ubuntu fr, Wikipédia,
Wikipedia
Les infos seront affichées sur la console, ou par la commande dmesg, et/ou dans /var/log/syslog et /var/log/kern.log.
Quelques "command key"
- h : aide
- d : liste les locks
- t : liste l'état des tâches
- c : simule un crash et créée un crash dump - utile quand Linux est bloqué (hang), ça fait partir le
noyau Linux en kernel panic (system crash)
- e : envoi du signal SIGTERM à tous les process, sauf à init
- i : envoi du signal SIGKILL à tous les process, sauf à init
- s (sync), puis u (umount), puis o (shutdown), ou b (reboot) - utile quand Linux est bloqué (hang state)
2 solutions pour envoyer une commande au noyau (récolte d'infos, ou reboot, etc.)
- En modifiant /proc/sysrq-trigger
- # echo "la_command_key" > /proc/sysrq-trigger
- Exemple : # echo "h" > /proc/sysrq-trigger
- Par les touches clavier
- Alt + Syst + "la command key" (Syst (ou SysRq) est la touche "Impr écran", à droite de F12)
- Exemple : Alt + Syst + h
Note : l'opération par le clavier n'est possible que si /proc/sys/kernel/sysrq est à 1
- Vérifier si le mécanisme est actif
- # cat /proc/sys/kernel/sysrq
- S'il ne l'est pas, activer les magic keys dynamiquement
- # echo 1 > /proc/sys/kernel/sysrq
- Activer les magic keys au reboot : dans sysctl.conf
- kernel.sysrq = 1 (sysrq actif ou pas)
En cas de Linux bloqué (hung/hang), shutdown ou reboot par "Magic SysRq"
Tout en maintenant enfoncées les 2 touches Alt SysRq, taper - au choix - ces command
key SysRq :
reisuo o => shutdown
reisub b => reboot
|
Périphériques
La gestion des périphériques, de leurs devices (lspci,
ls /dev) et de leurs drivers/modules est assurée par devfs
(gestion statique), ou par udev (gestion dynamique) dans certaines distributions (récentes).
Infos Wikipédia
Mes infos systemd
Plus d'infos sur udev, tutoriel
udev
Config
- /etc/udev/udev.conf
- /etc/udev/rules.d (utilisé au boot, mais les modifs de ces fichiers sont également prises en compte à tout
moment ; + d'infos dans son README)
- 70-persistent-net.rules (pour les devices réseau), etc.
- /lib/udev/rules.d (+ d'infos dans son README)
Commande udevadm
- $ udevadm info --query=all --name=/dev/sda (liste les attributs du périphérique
/dev/sda)
- $ udevadm info -a -p $(udevadm info -q path -n /dev/sda) (de même, avec infos
parents)
Debug
- Pour logger d'éventuelles erreurs, ajouter à /etc/udev/udev.conf : udev_log="err"
- Pour un debug dynamique : udevadm control --log-priority=info
Loadable Kernel Modules (LKM)
Ces modules sont des éléments de noyau (pilotes, systèmes de fichiers) chargeables dynamiquement.
Docs
Configuration - fichiers de config pour la construction du initrd
- /etc/sysconfig/kernel (nom des modules à intégrer dans le initrd) - RHEL, SLES,
etc.
Configuration - fichiers de config
- /etc/modprobe.conf (noms des modules à charger ou à désactiver au boot) - RHEL 4,
etc.
- ex : alias edac_core off (au cas
où la carte mère surveillerait déjà les défaillances RAM)
- Doc locale : man modprobe.conf
- /etc/modules.d/le_module.conf
- /etc/modules (noms des modules à charger au boot + leurs paramètres) - Debian, Ubuntu,
etc.
- /etc/modprobe.d/
- Debian,
Ubuntu, RHEL 6, etc.
- blacklist.conf (noms des modules à ne pas charger au boot)
- ex : blacklist edac_core (au cas où la carte mère
surveillerait déjà les défaillances RAM)
- nom_du_module.conf (paramètres de ce module)
- sysfs : /sys/module
Modules
- Dans /lib/modules/`uname -r`
- /lib/modules/`uname -r`/modules.dep (dépendances entre les modules), modules.dep est créé par la commande
depmod)
- Exemple : module NFS
Chargement au boot
- init, par son script /etc/init/module-init-tools.conf, lit le fichier de config /etc/modules et charge les modules par la commande
modprobe (Ubuntu)
- udev se charge du chargement des modules dans certaines distrib (ayant une version récente du noyau)
Commandes
- # lsmod
- # insmod (charge un module - kerneld utilise insmod pour charger automatiquement des modules quand c'est nécessaire)
- # rmmod
- # man -k modprobe
- # man -k modules.dep
Infos sur les modules
- $ modprobe --showconfig
- # find /sys/module | grep version | grep -v srcversion
- # cat /etc/modules (modules chargés au boot)
- Exemple : module NFS
- Lister les modules chargés dans le noyau : lsmod (mise en forme de
/proc/modules).
- # lsmod | grep -E 'Module|nom_du_module'
- # lsmod | grep nfs && modinfo nfs
- # modinfo nom_du_module
- autre commande : modprobe, qui affiche moins d'infos
- # modprobe -l
- # modprobe -l nom_du_module
Outil "module assistant" (commande : m-a)
- gère des paquets de modules (destinés à un ou plusieurs noyaux), aide à les construire et les installer
- exemple DRBD (avant qu'il soit intégré au noyau Linux 2.6.33)
- # apt-get install module-assistant
- # cd /usr/src ; tar -zxvf drbd.tar.gz ; cd /usr/src/drbd/modules
- # m-a prepare
- # m-a automatic-install drbd-module-source
|
Clock
Infos dans la section "Notes" du man 8 hwclock
- There are two main clocks in a Linux system
- The Hardware Clock...
- The System Time...
- How hwclock Accesses the Hardware Clock...
|
Mémoire
Config boot et modules
Au cas où la carte mère surveillerait déjà les défaillances RAM, au niveau du noyau Linux :
Exemples de config paramètres
Mes autres infos mémoire 
|
|