Опитвам се да профилирам многонишкова програма, която съм написал на малко по-голяма машина (32 ядра, 256 GB RAM). Забелязах, че между стартиранията производителността на програмата може да варира драстично (70-80%). Изглежда не мога да намеря причината за тази огромна разлика в производителността на програмата, но анализирайки резултата от помощната програма „време“ при голям брой изпълнения, забелязах, че броят на неволните превключвания на контекста корелира силно с производителност на програмата (очевидно по-малко превключвания на контекст водят до по-добра производителност и обратно).
Има ли някакъв добър начин да се определи какво причинява това превключване на контекста? Ако мога да открия виновника, тогава може би ще мога да се опитам да отстраня проблема. Имам обаче няколко конкретни ограничения за инструментите, които мога да използвам. Първо, нямам root привилегии на машината, така че всички инструменти, изискващи такива привилегии, са изключени. Второ, това е доста старо ядро (RHEL5, ядро 2.6.18), така че някои от стандартните неща за perf-събития може да не присъстват. Както и да е, всякакви предложения за това как да се задълбочим в причината за това превключване на контекста ще бъдат много оценени.
Актуализация: Реших да тествам програмата си на различна (и по-малка) машина. Другата машина е 4-ядрен (с хиперзаглавие) Linux кутия с 8 Gb RAM и много по-ново ядро --- 3.2.0 срещу 2.6.18 на другата машина. На новата машина не мога да възпроизведа бимодалния профил на производителност. Това ме кара да вярвам, че проблемът се дължи или на хардуерен проблем (както беше предложено в коментарите), или на особено патологичен случай на ниво ядро, който оттогава е коригиран. Моята текуща най-добра хипотеза е, че това може да е резултат от факта, че новата машина има ядро с напълно справедлив планировчик (CFS), докато старата машина няма. Има ли начин да тествате тази хипотеза (да кажете на новата машина да използва различен/по-стар планировчик), без да се налага да компилирате стара версия на ядрото за новата машина?
top
, докато програмата ви работи? Каквото и да ви изпреварва, вероятно използва много CPU.... - person Tony Delroy   schedule 24.06.2013time
всъщност разгражда контекстните превключвания чрез доброволно/неволно. Дефиницията на неволни контекстни превключвания тук е, когато вашият процес е изпреварен от операционната система по някаква причина, различна от това, че доброволно се отказва от контрола (напр. предаване/изчакване). Това може да се случи, когато неговият отрязък от време изтече и има процес с по-висок приоритет, който трябва да бъде изпълнен, и вероятно при редица други условия. - person nomad   schedule 24.06.2013