Skype et CPU élevé

Depuis quelques temps, j’ai remarqué que mon Skype consommait beaucoup de CPU alors qu’il était simplement démarré et connecté à mon compte.

On peut le voir sur le screenshot de Process Explorer ci-dessous.

process explorer

Dans l’onglet “Threads”, on voit qu’un seul thread (TID = 8556) consomme la quasi totalité du CPU utilisé par Skype.

image

Après avoir pris plusieurs dumps avec ProcDump (Skype semble ne pas trop aimer être breaké par WinDbg, il lance un nombre incalculable d’access violation lors de la libération du processus).

Grâce à la commande “!runaway” (informations disponibles ici), on retrouve le même thread qui consomme du CPU.

0:051> !runaway
User Mode Time
  Thread       Time
  31:216c      0 days 0:10:27.763
  17:1214      0 days 0:00:16.130
   9:610       0 days 0:00:05.647
   0:1fd4      0 days 0:00:05.226
  35:758       0 days 0:00:01.232
  39:21e8      0 days 0:00:00.904
  38:1e64      0 days 0:00:00.764
  36:1714      0 days 0:00:00.202
  10:10cc      0 days 0:00:00.109
   5:1710      0 days 0:00:00.093
   2:21e4      0 days 0:00:00.093

Pour rappel, le TID est donné en hexadécimal avec “!runaway”, il faut le convertir pour retrouver le même TID que celui donné dans Process Explorer.

0:051> ? 216c 
Evaluate expression: 8556 = 0000216c

On change le thread courant sur la thread 31 (debugger shorthand ID : identifiant donné par le débuggeur au thread). On affiche ensuite la callstack du thread courant.

On peut constater que le module “Flash” apparait plusieurs fois sur la callstack. Malheureusement, Adobe ne fournit visiblement pas de symbôles publics pour Flash (malgrès les commentaires de cet article datant de 2010).

C’est pourquoi on aperçoit des offsets énormes sur la callstack.

0:051> ~31s

0:031> kb
ChildEBP RetAddr  Args to Child             
WARNING: Stack unwind information not available. Following frames may be wrong.
0af5e300 5e21efc2 14b52c18 000124f8 00000000 Flash+0xfe534
0af5e324 5e21ed3d 00000000 00000000 000003e8 Flash+0xfefc2
0af5e3b0 5e273a5e 1311e0b0 0af5ece8 00000000 Flash+0xfed3d
0af5ecc4 5e272808 0af5ece8 13133040 13133040 Flash+0x153a5e
0af5ed2c 5e31ff7a 13133040 13133040 0af5ed40 Flash+0x152808
0af5eda0 5e31c1b4 00000001 13133040 0aa541b0 Flash+0x1fff7a
0af5edd0 5e32001e 0aa541b0 00000000 00000001 Flash+0x1fc1b4
0af5edf0 5e3c7e13 1311e0b0 00000001 0aa541b0 Flash+0x20001e
0af5eef0 67583e9a 0aa5417c 00000001 00000000 Flash!DllUnregisterServer+0x365b3
0af5ef10 66dbdea5 0a8b3564 0a8b3050 0a8b3564 mshtml!memcpy+0xb98f0
0af5ef38 66f7b1ec 0a8b3050 0a9096b8 00000000 mshtml!CPaintController::NotifyPreRender+0x9e
0af5f1ec 66a3b61a 00008c80 00000000 0a8b3050 mshtml!CView::EnsureView+0x1e21
0af5f40c 66d3c65b 00000001 00000695 0a8b3050 mshtml!CDoc::PaintWorker+0x173
0af5f424 66a39b47 00000001 0a90b530 0abf85f8 mshtml!CDoc::PaintInPlace+0x29
0af5f444 66a36cb3 0090b530 002cedb6 00000000 mshtml!CPaintController::RunRenderingLoop+0x48
0af5f45c 66a366e6 0abf85f8 0abd08a8 00000000 mshtml!CPaintController::OnUpdateBeat+0x25
0af5f47c 66a36e1e 00000000 0abd0870 0a90b500 mshtml!CPaintBeat::OnBeat+0x17a
0af5f494 66a3631a 0a8b306c 00000000 0abd0870 mshtml!CPaintBeat::OnVSyncMethodCall+0x51
0af5f4ec 669f9c19 26772b77 00000000 0000000f mshtml!GlobalWndOnPaintPriorityMethodCall+0x179
0af5f538 756d77d8 002d04f6 000003a2 00000000 mshtml!GlobalWndProc+0xd3
0af5f564 756d90e7 669f9b45 002d04f6 0000000f user32!InternalCallWinProc+0x23
0af5f5e0 756d7b6f 669f9b45 669f9b45 00000000 user32!UserCallWinProcCheckWow+0xdb
0af5f644 756d7c44 038dcce0 00000000 0000000f user32!DispatchClientMessage+0x15d
0af5f680 772c2c92 0af5f698 00000000 0af5f6fc user32!__fnDWORD+0x2b
0af5f694 038dcce0 00000000 0000000f 00000000 ntdll!KiUserCallbackDispatcher+0x2e
0af5f70c 756d8a66 00000000 0000000f 0af5f78c 0x38dcce0
*** WARNING: Unable to verify checksum for C:\Program Files (x86)\Skype\Phone\Skype.exe
*** ERROR: Module load completed but symbols could not be loaded for C:\Program Files (x86)\Skype\Phone\Skype.exe
0af5f71c 0254bc85 0af5f72c 00000a00 002d04f6 user32!DispatchMessageW+0x10
0af5f78c 0131c4b1 0af5f7a0 0131c4bb 0af5f7bc Skype+0x127bc85
0af5f7bc 012d70f6 0af5f810 012d6b58 0af5f7d0 Skype+0x4c4b1
0af5f7d0 74a9850d 01221570 0af5f820 772dbf39 Skype+0x70f6
0af5f7dc 772dbf39 01221570 374f47f3 00000000 KERNEL32!BaseThreadInitThunk+0xe
0af5f820 772dbf0c 012d70cc 01221570 ffffffff ntdll!__RtlUserThreadStart+0x72
0af5f838 00000000 012d70cc 01221570 00000000 ntdll!_RtlUserThreadStart+0x1b

Si on fait la même opération sur les 2 autres dumps pris, on retrouve également le module “Flash” dans la callstack du thread 31.

On peut donc fortement penser que Flash est responsable de la consommation CPU.

Après plusieurs tests, je me suis rendu compte que la consommation CPU n’était forte que lorsque Skype était sur sa page d’accueil (ci-dessous) qui contient des publicités.

pub

Un simple clique-droit sur un de ces encarts montre que ces derniers sont en Flash.

flash

On voit très nettement lorsque Skype est sur son écran d’accueil et lorsqu’on change pour afficher une conversation.

low cpu

CPU  Debug  Skype  WinDBG 

Voir également