Linux Mint 16:Skype 使用 100% 的 CPU 核心
我使用 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
以查看整個流程在做什麼。strace - 附加到正在執行的程序
您還可以使用
strace
附加到已執行的程序。這允許您在他們開始行為不端后附加。例子
假設我們想
htop
從上面附加到我們已經執行的程序。$ pgrep htop 32495
這是
htop
PID - 程序 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() 系統呼叫
提供的
strace
OP 顯示了高級別的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