kworker가 Linux 3.0.0-12-server에서 그렇게 많은 리소스를 소비하는 이유는 무엇입니까?

kworker가 Linux 3.0.0-12-server에서 그렇게 많은 리소스를 소비하는 이유는 무엇입니까?

지난 금요일에 Ubuntu 서버를 11.10으로 업그레이드했으며 현재 3.0.0-12 서버 커널을 실행하고 있습니다. 그 시점부터 전반적인 성능이 급격히 떨어졌습니다. 업그레이드 전 시스템 로드는 0.3 정도였지만, 현재 16GB RAM(10GB 사용 가능, 스왑 사용 안 함)을 갖춘 8코어 CPU 시스템에서 시스템 로드는 22~30입니다.

[md1_raid1] 및 [btrfs-transacti]가 많은 리소스를 소비하기 때문에 BTRFS 파일 시스템 드라이버와 기본 MD 배열을 비난하려고 했습니다. 그러나 모든 [kworker/*:*]는 더 많은 것을 소비합니다.

sar금요일부터 다음과 같은 내용이 출력되었습니다.

11:25:01        CPU     %user     %nice   %system   %iowait    %steal     %idle 
11:35:01        all      1,55      0,00     70,98      8,99      0,00     18,48 
11:45:01        all      1,51      0,00     68,29     10,67      0,00     19,53 
11:55:01        all      1,40      0,00     65,52     13,53      0,00     19,55 
12:05:01        all      0,95      0,00     66,23     10,73      0,00     22,10 

그리고 iostat쓰기 속도가 매우 낮은 것을 확인했습니다.

sda             129,26      3059,12       614,31  258226022   51855269          
sdb              98,78        24,28      3495,05    2049471  295023077          
md1             191,96       202,63       611,95   17104003   51656068          
md0               0,01         0,02         0,00       1980        109          

문제는 kworker 스레드가 왜 그렇게 많은 리소스(그리고 어떤 리소스)를 소비하는지 알아내는 방법입니다. 아니면 더 나은 방법이 있습니다. 이것이 3.0 커널의 알려진 문제입니까? 커널 매개변수를 사용하여 조정할 수 있나요?

편집하다:

BTRFS 개발자의 권장에 따라 커널을 새로운 3.1 버전으로 업데이트했습니다. 그러나 불행하게도 이것은 아무것도 바꾸지 않습니다.

답변1

내가 찾은lml에 대한 이 스레드이것은 귀하의 질문에 다소 답변됩니다. (Linus 자신도 이 스레드가 어디서 왔는지 알아내는 방법에 대해 혼란스러워하는 것 같습니다.)

기본적으로 이를 수행하는 방법에는 두 가지가 있습니다.

$ echo workqueue:workqueue_queue_work > /sys/kernel/debug/tracing/set_event
$ cat /sys/kernel/debug/tracing/trace_pipe > out.txt
(wait a few secs)

이를 위해서는 당신이 필요합니다커널에서 컴파일하고 다음을 사용하여 활성화합니다.

mount -t debugfs nodev /sys/kernel/debug

Linux 함수 추적 도구에 대한 자세한 내용은 다음을 참조하세요.ftrace.txt 문서.

이는 스레드가 수행하는 작업을 출력하며 여러 개의 소규모 작업을 추적하는 데 유용합니다.

cat /proc/THE_OFFENDING_KWORKER/stack

그러면 많은 작업을 수행하는 단일 스레드의 스택이 출력됩니다. 이를 통해 특정 스레드가 CPU를 소비하게 하는 원인이 무엇인지 알아낼 수 있습니다(예:). THE_OFFENDING_KWORKER프로세스 목록에 있는 kworker의 pid입니다.

답변2

해결책은: 원인을 찾는 방법을 모른다는 것입니다. 지금까지 아무도 나에게 말해주지 않았습니다.

그러나 BTRFS 개발자들과 이야기를 나누다 보면 매우 짧은 시간에 많은 작은 파일을 작성할 때 btrfs 드라이버에 버그가 있다는 사실이 밝혀졌습니다. 이는 커널 3.0~3.1에서 발생하는 문제입니다. 아마도 3.2에서는 수정될 것 같습니다.

그동안 문제를 해결하기 위해 현재 커널에 대한 패치를 받았습니다.

답변3

kworker의 스레드 스택을 보면 비슷한 문제가 있었습니다.

while true ; do clear ; grep -n ^ /proc/24910/stack | sort -rn | cut -d: -f 2- ; sleep 1 ; done

[<ffffffffffffffff>] 0xffffffffffffffff
[<ffffffff810908f0>] kthread+0x0/0xe0
[<ffffffff81576432>] ret_from_fork+0x42/0x70
[<ffffffff810908f0>] kthread+0x0/0xe0
[<ffffffff810909b1>] kthread+0xc1/0xe0
[<ffffffff8108b520>] worker_thread+0x0/0x550
[<ffffffff8108b573>] worker_thread+0x53/0x550
[<ffffffff8108aa4b>] process_one_work+0x14b/0x420
[<ffffffff81405a3d>] rpm_idle+0x1ad/0x220
[<ffffffff8140509d>] __rpm_callback+0x2d/0xb0
[<ffffffffa01aef16>] usb_runtime_idle+0x26/0x30 [usbcore]
[<ffffffffa01aeef0>] usb_runtime_idle+0x0/0x30 [usbcore]
[<ffffffff8140686c>] __pm_runtime_suspend+0x5c/0x90
[<ffffffff81405b19>] __pm_runtime_idle+0x69/0x90
[<ffffffff81405295>] rpm_suspend+0x105/0x620
[<ffffffff8140513f>] rpm_callback+0x1f/0x70
[<ffffffff8140509d>] __rpm_callback+0x2d/0xb0
[<ffffffffa01aee50>] usb_runtime_suspend+0x0/0x80 [usbcore]
[<ffffffffa01aee7e>] usb_runtime_suspend+0x2e/0x80 [usbcore]
[<ffffffffa01adc4f>] usb_suspend_both+0xef/0x1f0 [usbcore]
[<ffffffffa01adb06>] usb_resume_interface.isra.6+0xa6/0x100 [usbcore]
[<ffffffffa01a0c63>] hub_resume+0x23/0x60 [usbcore]
[<ffffffffa01a0636>] hub_activate+0xc6/0x5c0 [usbcore]
[<ffffffffa01a9d3f>] usb_kill_urb+0x3f/0xa0 [usbcore]
[<ffffffffa019d249>] hub_port_status+0xd9/0x120 [usbcore]
[<ffffffff81088a4f>] __queue_work+0x12f/0x340
[<ffffffff810888b6>] insert_work+0x46/0xb0
[<ffffffffa01aa6d4>] usb_control_msg+0xc4/0x110 [usbcore]
[<ffffffffa01aa55a>] usb_start_wait_urb+0x9a/0x150 [usbcore]
[<ffffffff810a36f7>] update_curr+0xd7/0x120

USB 모듈인 것 같아요. 나는 이전에 다른 컴퓨터에서 모든 USB 및 [uex]hci 모듈을 행복하게 rmmod했고 키보드를 껐다는 것을 깨달았습니다(ctrl-shift-sysrq-U도 아닙니다!). 그래서 결국 다음과 같이 했습니다:

MODS="uvcvideo ohci_hcd ehci_hcd xhci_hcd ohci_pci ehci_pci xhci_pci usbcore"
( echo $MODS $MODS | xargs -n 1 rmmod -v ; sleep 3 ; echo $MODS | xargs -n 1 modprobe -v ; )

root@hp:~# ( echo $MODS $MODS | xargs -n 1 rmmod -v ; sleep 3 ; echo $MODS | xargs -n 1 modprobe -v ; )
rmmod: ERROR: Module ohci_hcd is in use by: ohci_pci
rmmod: ERROR: Module ehci_hcd is in use by: ehci_pci
rmmod: ERROR: Module xhci_hcd is in use by: xhci_pci
rmmod: ERROR: Module uvcvideo is not currently loaded
rmmod: ERROR: Module ohci_pci is not currently loaded
rmmod: ERROR: Module ehci_pci is not currently loaded
rmmod: ERROR: Module xhci_pci is not currently loaded
insmod /lib/modules/4.1.0-2-amd64/kernel/drivers/media/usb/uvc/uvcvideo.ko 
insmod /lib/modules/4.1.0-2-amd64/kernel/drivers/usb/host/ehci-hcd.ko 
insmod /lib/modules/4.1.0-2-amd64/kernel/drivers/usb/host/ohci-hcd.ko 
insmod /lib/modules/4.1.0-2-amd64/kernel/drivers/usb/host/xhci-hcd.ko 
insmod /lib/modules/4.1.0-2-amd64/kernel/drivers/usb/host/ehci-pci.ko 
insmod /lib/modules/4.1.0-2-amd64/kernel/drivers/usb/host/ohci-pci.ko 
insmod /lib/modules/4.1.0-2-amd64/kernel/drivers/usb/host/xhci-pci.ko 

효과가 있었습니다:

grep -n ^ /proc/24910/stack | sort -rn | cut -d: -f 2-
[<ffffffffffffffff>] 0xffffffffffffffff
[<ffffffff810908f0>] kthread+0x0/0xe0
[<ffffffff81576432>] ret_from_fork+0x42/0x70
[<ffffffff810908f0>] kthread+0x0/0xe0
[<ffffffff810909b1>] kthread+0xc1/0xe0
[<ffffffff8108b520>] worker_thread+0x0/0x550
[<ffffffff8108b5ec>] worker_thread+0xcc/0x550

그래서 제가 가장 의심하는 것은 RTL8723B* WIFI+Bluetooth 모듈입니다. 이제 사용하지 않는 BT 어댑터를 종료하려고 하면 전원 관리 코드가 동일한 장치임을 인식하는지 궁금합니다.

문맥:

root@hp:~# lsusb
    Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 002 Device 002: ID 0c45:651b Microdia 
    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 003 Device 002: ID 0bda:b001 Realtek Semiconductor Corp. 
    Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 009 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 008 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 007 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 006 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

root@hp:~# lsmod | grep usb
    btusb                  45056  0
    btbcm                  16384  1 btusb
    btintel                16384  1 btusb
    bluetooth             438272  5 bnep,btbcm,btusb,btintel
    usbcore               200704  8 btusb,uvcvideo,ohci_hcd,ohci_pci,ehci_hcd,ehci_pci,xhci_hcd,xhci_pci
    usb_common             16384  1 usbcore

root@hp:~# lsb_release -a
    No LSB modules are available.
    Distributor ID:    Debian
    Description:    Debian GNU/Linux stable-updates (sid)
    Release:    stable-updates
    Codename:    sid

root@hp:~# uname -a
    Linux hp 4.1.0-2-amd64 #1 SMP Debian 4.1.6-1 (2015-08-23) x86_64 GNU/Linux

root@hp:~# dmesg | tail -n 20
    [97865.088740] usb 2-4: SerialNumber: HP Webcam
    [97865.091557] uvcvideo: Found UVC 1.00 device HP Webcam (0c45:651b)
    [97865.105948] input: HP Webcam as /devices/pci0000:00/0000:00:13.2/usb2/2-4/2-4:1.0/input/input17
    [97865.189817] usb 3-3: new full-speed USB device number 2 using ohci-pci
    [97865.350981] usb 3-3: No LPM exit latency info found, disabling LPM.
    [97865.368958] usb 3-3: New USB device found, idVendor=0bda, idProduct=b001
    [97865.368969] usb 3-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    [97865.368976] usb 3-3: Product: Bluetooth Radio 
    [97865.368981] usb 3-3: Manufacturer: Realtek 
    [97865.368985] usb 3-3: SerialNumber: 00e04c000001
    [97865.375859] Bluetooth: hci0: rtl: examining hci_ver=06 hci_rev=000b lmp_ver=06 lmp_subver=8723
    [97865.375867] Bluetooth: hci0: rtl: loading rtl_bt/rtl8723b_fw.bin
    [97865.375896] usb 3-3: firmware: failed to load rtl_bt/rtl8723b_fw.bin (-2)
    [97865.375902] usb 3-3: Direct firmware load for rtl_bt/rtl8723b_fw.bin failed with error -2
    [97865.375907] Bluetooth: hci0: Failed to load rtl_bt/rtl8723b_fw.bin
    [97865.397812] Bluetooth: hci0: rtl: examining hci_ver=06 hci_rev=000b lmp_ver=06 lmp_subver=8723
    [97865.397821] Bluetooth: hci0: rtl: loading rtl_bt/rtl8723b_fw.bin
    [97865.397850] usb 3-3: firmware: failed to load rtl_bt/rtl8723b_fw.bin (-2)
    [97865.397856] usb 3-3: Direct firmware load for rtl_bt/rtl8723b_fw.bin failed with error -2
    [97865.397861] Bluetooth: hci0: Failed to load rtl_bt/rtl8723b_fw.bin

답변4

echo N >/sys/module/drm_kms_helper/parameters/poll (루트 모드에서)

인텔 그래픽 카드 문제

관련 정보