kworkerのCPU使用率が高すぎるのでなんとかした

題名の通りkworkerのCPU使用率が高いのをなんとかした記録。OSはCentOS 7.2

ぐぐってみたところ

Linuxで一つのコアのCPU利用率が異様に高いのを何とかする - Qiita

ubuntuでkworkerのcpu使用率がやたら高い - Qiita

ヒットするが、こちらの環境とはマッチしないみたい。

覚えたてのperfを使ってみます。

Samples: 44K of event 'cycles', Event count (approx.): 40358935514
  Children      Self  Command         Shared Object             Symbol
+   70.47%     0.00%  kworker/2:2     [kernel.kallsyms]         [k] kthread
+   70.47%     0.00%  kworker/2:2     [kernel.kallsyms]         [k] ret_from_fork
+   70.47%     0.00%  kworker/2:2     [kernel.kallsyms]         [k] worker_thread
+   70.44%     0.07%  kworker/2:2     [kernel.kallsyms]         [k] process_one_work
+   69.37%     0.05%  kworker/2:2     [kernel.kallsyms]         [k] rpm_idle
+   69.09%     0.08%  kworker/2:2     [kernel.kallsyms]         [k] rpm_suspend
+   68.98%     0.03%  kworker/2:2     [kernel.kallsyms]         [k] pm_runtime_work
+   68.83%     0.04%  kworker/2:2     [kernel.kallsyms]         [k] __rpm_callback
+   68.78%     0.01%  kworker/2:2     [kernel.kallsyms]         [k] usb_runtime_idle
+   68.74%     0.01%  kworker/2:2     [kernel.kallsyms]         [k] __pm_runtime_suspend
+   68.54%     0.00%  kworker/2:2     [kernel.kallsyms]         [k] rpm_callback
+   68.49%     0.01%  kworker/2:2     [kernel.kallsyms]         [k] usb_runtime_suspend
+   68.46%     0.03%  kworker/2:2     [kernel.kallsyms]         [k] usb_suspend_both
+   66.53%     0.01%  kworker/2:2     [kernel.kallsyms]         [k] usb_resume_interface.isra.5
+   66.53%     0.01%  kworker/2:2     [kernel.kallsyms]         [k] hub_resume
+   66.49%     0.42%  kworker/2:2     [kernel.kallsyms]         [k] hub_activate
+   65.50%     0.28%  kworker/2:2     [kernel.kallsyms]         [k] hub_port_status
+   64.32%     0.28%  kworker/2:2     [kernel.kallsyms]         [k] usb_control_msg
+   61.81%     0.22%  kworker/2:2     [kernel.kallsyms]         [k] usb_start_wait_urb
+   56.04%     0.07%  kworker/2:2     [kernel.kallsyms]         [k] usb_submit_urb
+   55.97%     0.54%  kworker/2:2     [kernel.kallsyms]         [k] usb_submit_urb.part.5
+   54.46%     1.71%  kworker/2:2     [kernel.kallsyms]         [k] usb_hcd_submit_urb
+   40.82%    39.99%  kworker/2:2     [kernel.kallsyms]         [k] xhci_hub_control
+   16.33%     0.00%  ksoftirqd/2     [kernel.kallsyms]         [k] kthread
+   16.33%     0.00%  ksoftirqd/2     [kernel.kallsyms]         [k] ret_from_fork
+   15.88%     1.32%  ksoftirqd/2     [kernel.kallsyms]         [k] smpboot_thread_fn

xHCIが悪さをしているようです。

USBをリセットしてみます。

[Reset USB 2.0 (ehci) & USB 3.0 (xhci) Without Reboot in Linux Kernel] (http://www.ubuntubuzz.com/2016/06/reset-usb-20-ehci-usb-30-xhci-without-reboot-linux.html)

使用率が低くなりました。よかったね。

標準入力からの入力に対応していないコマンドを何とかしたいんだ

  • 例えばssh-keygen -lf ~/.ssh/authorized_keysでフィンガープリントを確認したいんだけど ssh-keygen -lfは、標準入力からの入力に対応してない。 /dev/stdinを使えば何とかなるらしい。

  • Serverspecでこんなことしたかったけど/dev/stdin使ったらできた。

describe command(%|ssh-keygen -lf /dev/stdin <<<"$(grep hogehoge /home/hogehoge/.ssh/authorized_keys)"|) do
  its(:stdout) { should contain('1a:2b:3c:4d:5e:6f:7g:8h:9i:10:11:12:13:14:15:16').after(/2048/) }
end

LVSの Hash Table Sizeを大きくします。

OSは、CentOS7です。 kernelを再構築する必要があります。

# yum groupinstall -y "development tools"
# yum install xmlto asciidoc hmaccalc python-devel newt-devel perl-ExtUtils-Embed pesign  elfutils-devel zlib-devel  binutils-devel audit-libs-devel numactl-devel pciutils-devel  ncurses-devel

kernelのSRPMをダウンロードします。

yumdownloader --source kernel

SRPMを展開します。

# yum install kernel-3.10.0-327.13.1.el7.src.rpm

RedHatのkernelパッケージには必要です。

# yum install rng-tools
# rngd -r /dev/urandom

RPMパッケージ名を変更しておきます。

sed -i -e 's/^# % define buildid .local/%define buildid .local/' /root/rpmbuild/SPECS/kernel.spec

Hash Table Sizeを12 -> 20に変更します。

sed -i -e 's/^CONFIG_IP_VS_TAB_BITS=12/CONFIG_IP_VS_TAB_BITS=20' /root/rpmbuild/SOURCES/kernel-3.10.0-x86_64.config

kernelのrpmを作ります。

rpmbuild -ba --target=$(uname -m) --with baseonly --without debug --without debuginfo kernel.spec

確認しておきます。サイズ大きくなりました。

[root@server ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=1048576)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  210.152.0.52:80 wlc persistent 60
  -> 10.21.0.4:80                 Route   0      0          0         
  -> 10.21.0.7:80                 Route   0      0          0         
  -> 10.21.0.31:80                Route   0      0          0         
  -> 10.21.0.97:80                Route   0      0          0         
  -> 10.21.0.120:80               Route   0      0          0         
  -> 10.21.0.151:80               Route   0      0          0         
  -> 10.21.0.172:80               Route   0      0          0         
  -> 10.21.0.226:80               Route   0      0          0         
[root@server ~]# 

keepalivedの1.1.20と1.2.2はvrrpが通らないんだね

CVE-2015-7547の対応で1台目のlibc6をupgradeしたら/var/log/messagesにエラーがで始めた。

Keepalived_vrrp: VRRP_Instance(image1:192.168.201.1) ignoring received advertisment...
Keepalived_vrrp: receive an invalid passwd!
Keepalived_vrrp: bogus VRRP packet received on bond0 !!!

keepalivedの設定は変更してないしと思ってググったらイカがヒット

blog.remibergsma.com

パスワードを短くしてkeepalivedを再起動したら今度はイカのようなエラーが。。

Keepalived_vrrp: VRRP_Instance(image1:192.168.201.1) ignoring received advertisment...
Keepalived_vrrp: receive a 0 auth, expecting 1!
Keepalived_vrrp: bogus VRRP packet received on bond0 !!!

結局、バージョンを合わせて直りました。

packerで複数NICなqemuイメージを作成する

packerで複数NICなqmuイメージをkickstartで作成するのに苦労したのでメモ

これが参考になった stackoverflow.com

qemuargsでmac addressを指定してるのは出来たイメージをkvmにインポートする時にブリッジを指定したかったから。

     "qemuargs": [ 
        [ "-serial", "file:serial.out" ],
    [ "-netdev", "user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2223-:22,net=10.0.2.0/24" ],
        [ "-device", "virtio-net,netdev=net0,mac=52:54:00:12:34:56" ],
    [ "-netdev", "user,id=net1" ],
        [ "-device", "virtio-net-pci,netdev=net1,mac=52:54:01:12:34:56" ]
      ],
      "boot_command":
      [
        "<tab>",
        " append console=ttyS0,115200n8 ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/centos6-ks.cfg ksdevice=eth0",
        "<enter>"
      ]

eth0はprovisionersのshellで設定。 eth1はkickstartで設定した。

kvmへのインポートはこんな感じで。

virt-install --memory 2048 --name test --disk /var/lib/libvirt/qemu/test --network bridge:br0 --mac=52:54:00:12:34:56 --network bridge:br1 --mac=52:54:01:12:34:56 --import

iptables -Sの出力結果

iptables -Sの出力結果って必ずしも/etc/sysconfig/iptablesと同じわけではないんですね。

/etc/sysconfig/iptablesにはこんな感じで書いてるのに

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

iptables -Sの出力は

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

ATSメモ

The server must support at least Transport Layer Security (TLS) protocol version 1.2. TLS1.2が必要 https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html

openssl 0.9.8はTLS1.2 , TLS1.1をサポートしてない。 https://www.suse.com/communities/conversations/tls-1-2/