12-23-2015, 03:22 PM
(Modification du message : 12-23-2015, 03:24 PM par LittleScarabee.)
Hello,
Je souhaite partager avec vous une petite optimisation / affiner le mode "Temps Réel" pour un processus sous linux, dans le cas c'est "squeezelite" :
* De base squeezelite après son démarrage génère plusieurs processus (1 parent & 3 enfants) et non un seul comme on pourrait le penser :
* Ensuite lorsque dans le fichier configuration vous placez la priorité du processus à "99" on obtient bien un temps réel, mais uniquement sur l'un des processus de Squeezelite, mais pas sur l'ensemble, cf. ci-dessous :
* Durant l'écoute d'un fichier, Squeezelite (qui travaille plus ou moins !!) répartie les actions sur l'un des autres processus crée à son démarrage : le processus passe donc de "Sleep" à "Running" :
> Comme on peut le voir sur la première copie d'écran c'est tout sauf le processus en RT qui travaille (j'utilise dans mon cas une carte audio interne SPDIF) ; lorsque j'attaque mon DAC via de l'USB c'était plutôt l'avant dernier processuis (en mode RT) qui faisait le travaille et qui au besoin passait "la main" aux autres processus...
* Maintenant si vous souhaitez passer Squeezelite en "full RT" il faut pour cela :
1 / Sauvegarder et Editer le fichier de service :
# sudo cp /usr/lib/systemd/system/squeezelite.service /usr/lib/systemd/system/squeezelite.service.bkp
# sudo vim /usr/lib/systemd/system/squeezelite.service
2 / A la section [Service] :
> Commenter les lignes suivantes :
> Ajouter les lignes suivantes
Source / Lecture : Systemd & Scheduler
3 / Recharger la configuration de systemd et redémarrer les services :
Note : je redémarre SqueezeBoxServer car j'ai pu constater une utilisation anormale du CPU par squeezelite sans cette action...
4 / Vérifier tout ça via la commande "htop" (plus détaillée que top) ce qui donne :
> On a bien tous nos processus en mode RT !
Mon retour : j'ai le sentiment qu'on a un son plus dynamique et plus de clair, je vous laisse juger par vous même.
Il est possible d'aller "un poil" plus loin en faisant une affinité sur un coeur du processeur, car comme tout processus l'OS gére lui même la répartition sur les différents CPU disponible ...pour l'avoir testé en forçant le processus sur un seul coeur : j'ai surtout eu un soucis de stabilité CPU ensuite...donc attention ! Après cela mets rapidement en évidence les petits soucis de latence que l'on peut avoir : j'ai eu au début beaucoup coupure lorsque j'écoutais des fichiers lus depuis mon NAS via NFS...en jouant sur le buffer on arrive à gérer tout
Si vous souhaitez quand même le faire rien de plus simple, il faut pour cela :
1 / Editer le fichier de service :
# sudo vim /usr/lib/systemd/system/squeezelite.service
2 / A la section [Service] :
> Ajouter la ligne suivante :
CPUAffinity=0,1
Source : Set Affinity CPU
3 / Recharger la configuration de systemd et redémarrer les services :
La seule chose que je n'explique pas aujourd'hui, faute d'informations : pourquoi Squeezelite génère-t-il autant de processus
Pour LMS c'est possible de le faire : il faut ajouter les mêmes lignes dans son fichier de service sans commenter l'existant :
A bientôt
Je souhaite partager avec vous une petite optimisation / affiner le mode "Temps Réel" pour un processus sous linux, dans le cas c'est "squeezelite" :
* De base squeezelite après son démarrage génère plusieurs processus (1 parent & 3 enfants) et non un seul comme on pourrait le penser :
Code :
# pstree -p $(pidof squeezelite)
squeezelite(1762)─┬─{squeezelite}(1763)
├─{squeezelite}(1764)
└─{squeezelite}(1765)
* Ensuite lorsque dans le fichier configuration vous placez la priorité du processus à "99" on obtient bien un temps réel, mais uniquement sur l'un des processus de Squeezelite, mais pas sur l'ensemble, cf. ci-dessous :
* Durant l'écoute d'un fichier, Squeezelite (qui travaille plus ou moins !!) répartie les actions sur l'un des autres processus crée à son démarrage : le processus passe donc de "Sleep" à "Running" :
> Comme on peut le voir sur la première copie d'écran c'est tout sauf le processus en RT qui travaille (j'utilise dans mon cas une carte audio interne SPDIF) ; lorsque j'attaque mon DAC via de l'USB c'était plutôt l'avant dernier processuis (en mode RT) qui faisait le travaille et qui au besoin passait "la main" aux autres processus...
* Maintenant si vous souhaitez passer Squeezelite en "full RT" il faut pour cela :
1 / Sauvegarder et Editer le fichier de service :
# sudo cp /usr/lib/systemd/system/squeezelite.service /usr/lib/systemd/system/squeezelite.service.bkp
# sudo vim /usr/lib/systemd/system/squeezelite.service
2 / A la section [Service] :
> Commenter les lignes suivantes :
Code :
CPUSchedulingPolicy=batch
Nice=-20
LimitRTPRIO=infinity
LimitMEMLOCK=infinity
> Ajouter les lignes suivantes
Code :
CPUSchedulingPolicy=fifo
CPUSchedulingPriority=99
Source / Lecture : Systemd & Scheduler
3 / Recharger la configuration de systemd et redémarrer les services :
Code :
# sudo systemctl daemon-reload
# sudo systemctl restart squeezeboxserver
# sudo systemctl restart squeezelite
Note : je redémarre SqueezeBoxServer car j'ai pu constater une utilisation anormale du CPU par squeezelite sans cette action...
4 / Vérifier tout ça via la commande "htop" (plus détaillée que top) ce qui donne :
> On a bien tous nos processus en mode RT !
Mon retour : j'ai le sentiment qu'on a un son plus dynamique et plus de clair, je vous laisse juger par vous même.
Il est possible d'aller "un poil" plus loin en faisant une affinité sur un coeur du processeur, car comme tout processus l'OS gére lui même la répartition sur les différents CPU disponible ...pour l'avoir testé en forçant le processus sur un seul coeur : j'ai surtout eu un soucis de stabilité CPU ensuite...donc attention ! Après cela mets rapidement en évidence les petits soucis de latence que l'on peut avoir : j'ai eu au début beaucoup coupure lorsque j'écoutais des fichiers lus depuis mon NAS via NFS...en jouant sur le buffer on arrive à gérer tout
Si vous souhaitez quand même le faire rien de plus simple, il faut pour cela :
1 / Editer le fichier de service :
# sudo vim /usr/lib/systemd/system/squeezelite.service
2 / A la section [Service] :
> Ajouter la ligne suivante :
CPUAffinity=0,1
Source : Set Affinity CPU
3 / Recharger la configuration de systemd et redémarrer les services :
Code :
# sudo systemctl daemon-reload
# sudo systemctl restart squeezeboxserver
# sudo systemctl restart squeezelite
La seule chose que je n'explique pas aujourd'hui, faute d'informations : pourquoi Squeezelite génère-t-il autant de processus
Pour LMS c'est possible de le faire : il faut ajouter les mêmes lignes dans son fichier de service sans commenter l'existant :
Code :
CPUSchedulingPolicy=fifo
CPUSchedulingPriority=99
A bientôt
Streamer : Windows Server 2019 & AO 3 & HQPlayer | Aurdirvana -> Diretta
Dac : PS Paul Hynes SR4 -> Chord 2Qute
Casque : Auris HA-2SF -> Focal Clear MG
Démat : Auris HA-2SF -> Atoll IN100 By JCT (Ampli) -> Harbeth LS3/5A 11 Ohms
Vinyle : Thorens TD 295 MK IV & Autio-Technica AT-150MLX
Dac : PS Paul Hynes SR4 -> Chord 2Qute
Casque : Auris HA-2SF -> Focal Clear MG
Démat : Auris HA-2SF -> Atoll IN100 By JCT (Ampli) -> Harbeth LS3/5A 11 Ohms
Vinyle : Thorens TD 295 MK IV & Autio-Technica AT-150MLX