Linux-Mint

Linux Mint 16:Skype 使用 100% 的 CPU 核心

  • February 14, 2014

我使用 Linux Mint 16 Petra 64 位肉桂。當我安裝 Skype(來自 repo 或直接來自 Microsoft)時,它很快就開始使用 1 個 CPU 核心的 100%,使我的系統的功耗加倍。

我嘗試刪除~/.skype文件夾並使用不同的帳戶登錄。

我嘗試從儲存庫中刪除 Skype 並直接從 Microsoft 安裝它

我能做些什麼來解決和解決這個問題嗎?

我不能用舊的薄荷糖重現這個問題,也不能用 Ubuntu Saucy 和 Raring 重現這個問題。

如果我啟動 Skype 並且從不登錄(保持 Skype 顯示登錄螢幕),則不會顯示自身。但是,如果Skype之前已登錄並且CPU消耗很高 - 點擊“退出”並沒有解決問題(即使這樣做了,在不登錄的情況下使用Skype也沒有什麼意義)


按照@slm 的建議,我可以包含strace輸出。似乎 Skype 正忙於進行poll系統呼叫…我認為輪詢資源會導致處理器空閒,而不是 100% 的使用率。

strace -c skype
[ Process PID=31614 runs in 32 bit mode. ]

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 0.00    0.000000           0         1           execve
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                     1           total
System call usage summary for 32 bit mode:
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
96.95   45.349256         493     92056           poll
 1.26    0.588104           2    279026           clock_gettime
 0.99    0.462877           3    183996    182979 recv
 0.33    0.156517           2     79850       468 stat64
 0.30    0.138574           2     79740           gettimeofday
 0.10    0.047275          45      1040       174 futex
 0.04    0.020046        1671        12           nanosleep
 0.01    0.003025           4       792           writev
 0.00    0.002037           2       871           write
 0.00    0.001928           3       692       143 read
 0.00    0.001482           2       944       561 open
 0.00    0.000591           2       333       238 access
 0.00    0.000584           1       466           mmap2
 0.00    0.000577           1       421           madvise
 0.00    0.000485           1       431           close
 0.00    0.000462           4       120           munmap
 0.00    0.000378           3       115           mprotect
 0.00    0.000372           4        86           fstatfs64
 0.00    0.000269           1       263           fstat64
 0.00    0.000175           3        66        29 recvmsg
 0.00    0.000113           1       121           time
 0.00    0.000108           1       113         5 lstat64
 0.00    0.000082           3        29           getdents64
 0.00    0.000056           2        30           fadvise64_64
 0.00    0.000047           3        15           openat
 0.00    0.000046          15         3           shmdt
 0.00    0.000045           2        24           sendmsg
 0.00    0.000038           2        22           clone
 0.00    0.000037           1        33           socket
 0.00    0.000032           2        13           _llseek
 0.00    0.000032          11         3           shmat
 0.00    0.000032          11         3           shmget
 0.00    0.000031           1        29           brk
 0.00    0.000027           5         6           shmctl
 0.00    0.000015           2         9           send
 0.00    0.000013           0        27           fcntl64
 0.00    0.000011           2         6         2 connect
 0.00    0.000007           2         3           readlink
 0.00    0.000007           1        13           rt_sigaction
 0.00    0.000005           1         4           geteuid32
 0.00    0.000005           1         4           getsockname
 0.00    0.000003           0        10           uname
 0.00    0.000003           3         1           eventfd2
 0.00    0.000003           3         1           pipe2
 0.00    0.000002           2         1           set_tid_address
 0.00    0.000002           2         1           getpeername
 0.00    0.000001           1         2           rt_sigprocmask
 0.00    0.000001           1         2           getrlimit
 0.00    0.000001           1         2           clock_getres
 0.00    0.000001           1         1           set_robust_list
 0.00    0.000000           0         2           unlink
 0.00    0.000000           0         2           chmod
 0.00    0.000000           0         3         3 mkdir
 0.00    0.000000           0         1           pipe
 0.00    0.000000           0        22           ioctl
 0.00    0.000000           0         1           umask
 0.00    0.000000           0         4           statfs
 0.00    0.000000           0         4           fstatfs
 0.00    0.000000           0         2           flock
 0.00    0.000000           0         3           getuid32
 0.00    0.000000           0         1           getgid32
 0.00    0.000000           0         1           getegid32
 0.00    0.000000           0         1           getresuid32
 0.00    0.000000           0         1           getresgid32
 0.00    0.000000           0         2           gettid
 0.00    0.000000           0         1           sched_getaffinity
 0.00    0.000000           0         1           set_thread_area
 0.00    0.000000           0         4         1 bind
 0.00    0.000000           0         1           listen
 0.00    0.000000           0         2           sendto
 0.00    0.000000           0         1           shutdown
------ ----------- ----------- --------- --------- ----------------
100.00   46.775820                721911    184603 total

當我將 strace 附加到執行 Skype 時,sudo strace -p $(pgrep skype)我得到了大量以下條目:

clock_gettime(CLOCK_MONOTONIC, {7553, 920730509}) = 0
recv(6, 0xf967e5a8, 4096, 0)            = -1 EAGAIN (Resource temporarily unavailable)
clock_gettime(CLOCK_MONOTONIC, {7553, 920937548}) = 0
poll([{fd=3, events=POLLIN}, {fd=7, events=POLLIN}, {fd=6, events=POLLIN}, {fd=9, events=POLLIN}, {fd=12, events=POLLIN}, {fd=28, events=POLLIN}], 6, 0) = 0 (Timeout)
recv(6, 0xf967e5a8, 4096, 0)            = -1 EAGAIN (Resource temporarily unavailable)
clock_gettime(CLOCK_MONOTONIC, {7553, 921039735}) = 0
recv(6, 0xf967e5a8, 4096, 0)            = -1 EAGAIN (Resource temporarily unavailable)
clock_gettime(CLOCK_MONOTONIC, {7553, 921089170}) = 0
poll([{fd=3, events=POLLIN}, {fd=7, events=POLLIN}, {fd=6, events=POLLIN}, {fd=9, events=POLLIN}, {fd=12, events=POLLIN}, {fd=28, events=POLLIN}], 6, 0) = 0 (Timeout)

以與安裝受影響系統相同的方式重新安裝整個系統後,問題再也沒有出現。

誰說你不必格式化硬碟來解決Linux下的問題?;-)

strace 配置文件

您可以嘗試進一步調試它,strace以查看skype導致資源激增的系統呼叫。這將向您顯示哪些系統呼叫skype被卡住了。

例子

$ strace -c ls
afile1  afile2  afile3  afile4  afile5
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 0.00    0.000000           0         8           read
 0.00    0.000000           0         1           write
 0.00    0.000000           0        10           open
 0.00    0.000000           0        13           close
 0.00    0.000000           0         1           stat
 0.00    0.000000           0        11           fstat
 0.00    0.000000           0        27           mmap
 0.00    0.000000           0        18           mprotect
 0.00    0.000000           0         2           munmap
 0.00    0.000000           0         3           brk
 0.00    0.000000           0         2           rt_sigaction
 0.00    0.000000           0         1           rt_sigprocmask
 0.00    0.000000           0         2           ioctl
 0.00    0.000000           0         1         1 access
 0.00    0.000000           0         1           execve
 0.00    0.000000           0         2           getdents
 0.00    0.000000           0         1           getrlimit
 0.00    0.000000           0         2           statfs
 0.00    0.000000           0         1           arch_prctl
 0.00    0.000000           0         1           set_tid_address
 0.00    0.000000           0         1           openat
 0.00    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                   110         1 total

頂部和頂部

您還可以skype使用諸如top或之類的工具進行監控,htop以查看整個流程在做什麼。

   htop的ss

strace - 附加到正在執行的程序

您還可以使用strace附加到已執行的程序。這允許您在他們開始行為不端后附加。

例子

假設我們想htop從上面附加到我們已經執行的程序。

$ pgrep htop
32495

這是htopPID - 程序 ID。您可以使用這些來連接strace

$ strace -p 32495 |& head -10
Process 32495 attached
select(1, [0], NULL, NULL, {0, 729724}) = 0 (Timeout)
open("/proc/meminfo", O_RDONLY)         = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f685faf1000
read(3, "MemTotal:        7969128 kB\nMemF"..., 1024) = 1024
read(3, "e:        0\nHugePages_Rsvd:     "..., 1024) = 146
read(3, "", 1024)                       = 0
close(3)                                = 0
munmap(0x7f685faf1000, 4096)            = 0
...
...

更新 #1 - 調試 poll() 系統呼叫

提供的straceOP 顯示了高級別的poll()系統呼叫。您可以通過 了解這些是什麼man poll

  poll, ppoll - wait for some event on a file descriptor

所以 Skype 正在等待一個文件描述符,但在這種情況下,它不一定是一個文件,它可能是,但它可能正在等待一個包含在文件描述符中的網路資源。

例子

為了更好地展示這一點,這裡有一個例子。假設我們正在使用wget.

$ wget -O /dev/null http://speedtest.wdc01.softlayer.com/downloads/test100.zip

然後我們可以使用命令查看正在使用的文件描述符lsof -c wget

$ lsof -c wget
COMMAND   PID USER   FD   TYPE  DEVICE  SIZE/OFF    NODE NAME
wget    11531 saml  cwd    DIR   253,2      4096 7340394 /home/saml/media/mp3s/kids_music
wget    11531 saml  rtd    DIR   253,1      4096       2 /
wget    11531 saml  txt    REG   253,1    421712  531380 /usr/bin/wget
wget    11531 saml  mem    REG   253,1    310576  544452 /usr/lib64/libgssapi_krb5.so.2.2
...
...
wget    11531 saml  mem    REG   253,1     62368  528212 /usr/lib64/libnss_files-2.17.so
wget    11531 saml  mem    REG   253,1 106055264  803764 /usr/lib/locale/locale-archive
wget    11531 saml  mem    REG   253,1     26254  660143 /usr/lib64/gconv/gconv-modules.cache
wget    11531 saml    0u   CHR   136,2       0t0       5 /dev/pts/2
wget    11531 saml    1u   CHR   136,2       0t0       5 /dev/pts/2
wget    11531 saml    2u   CHR   136,2       0t0       5 /dev/pts/2
wget    11531 saml    3w   CHR     1,3       0t0    1028 /dev/null
wget    11531 saml    4u  IPv4 1543927       0t0     TCP greeneggs.bubba.net:55907->speedtest.wdc01.softlayer.com:htt

注意最後一行,這是我們連接到 softlayer.com 的文件描述符。所以網路連接也被視為poll()通過文件描述符的aa。您可以執行相同操作並使用以下命令進行確認:

$ lsof -c skype

引用自:https://unix.stackexchange.com/questions/108966