Bonjour,
effectuant des benchmarks sur des systèmes linux j'étudie actuellement les différences de comportement du scheduler.
En effet lorsqu'on laisse la gestion de l'affinité à l'OS nous obtiendrons un temps t1, en répétant le même programme mais en lui disant de tourner sur tel ou tel coeur on obtiendra un temps t2.
A savoir que le programme en question (mon bench) fait tourner un main qui est géré par le scheduler ainsi que trois threads qui sont soit gérés par le scheduler soit par moi même, les deux derniers threads effectuent des opérations de synchronisation ou d'envoi de messages (sémaphores nommées, pipe, mémoire partagée, ect).
J'obtiens des écarts de temps catastrophiques entre ces deux essais (t1 < t2), le fait de définir manuellement l'affinité cpu occasionne de sérieux écarts de temps.
Je précise que je tourne sur un ubuntu non patché RT pour mes tests afin d'avoir tous les outils possibles et inimaginables pour étudier le phénomène.
J'ai tenté de forcer les coeurs actifs de la même façon que le choix précédent du scheduler lorsqu'il en avait la charge.
J'ai tenté de forcer sur des coeurs au sein du même CPU (une machine avec deux CPUs de 4 coeurs chacun et une autre avec 1 CPU de 4 coeurs physiques qui virtualise 8 coeurs).
J'ai étudié le déroulement des threads avec LTTng sans observer la moindre différence, hormis pour les temps si "catastrophiques".
J'ai potassé pas mal de documentation, est allé voir dans le code du kernel la partie scheduler mais je n'ai rien trouvé...
Auriez-vous un outil me permettant de mettre en avant le pourquoi ?
Ou bien la doc miraculeuse que j'airai loupé expliquant cela ?
Cordialement,
xTG.
Partager