잘못된 docker 문제 배열 과정을 기록합니다

3225 단어

환경


OS: SUSE Linux Enterprise Server 12 SP2 DOCKER: 1.12.6 KERNEL: 4.4.59-92.20-default RANCHER: v1.6.2

문제


2018년 1월 어느 날, 테스트 환경에서 서버 발견
kernel:[1854773.108055] unregister_netdevice: waiting for eth0 to become free. Usage count = 1

임시 해결 방법: reboot

조사 과정

  • 오류 정보에 근거하여 이 버그를 빨리 찾았습니다. 오픈 시간은 Opened this issue on 6 May 2014https://github.com/moby/moby/issues/5618(지금은 이 문제가 해결된 것 같지만 그때는 1월이었다.)
  • 훗날 이 오류 정보는 cpu 부하가 높아지고dockerps 명령hang, 등'잡음'
  • 과 함께
  • 이 문제에 대해 재현 방법을 제시한 사람이 있다https://github.com/fho/docker-samba-loop위의 운영체제 코어 버전에서 재현 가능
  • kernel:[1598.704278] unregister_netdevice: waiting for lo to become free. Usage count = 1
    

    dockerfile을 수정하면 추가 명령
    sleep 10
    

    커널 오류 메시지가 나타나지 않습니다. 기다리는 동안 네트워크 연결이 정상적으로 닫혔을 수도 있습니다.
  • 이번 버그는kernel 4.4.114에서 복구되었습니다.https://cdn.kernel.org/pub/linux/kernel/v4.x/ChangeLog-4.4.114
  • 
    commit edaafa805e0f9d09560a4892790b8e19cab8bf09
    Author: Dan Streetman 
    Date:   Thu Jan 18 16:14:26 2018 -0500
    
        net: tcp: close sock if net namespace is exiting
        
        
        [ Upstream commit 4ee806d51176ba7b8ff1efd81f271d7252e03a1d ]
        
        When a tcp socket is closed, if it detects that its net namespace is
        exiting, close immediately and do not wait for FIN sequence.
        
        For normal sockets, a reference is taken to their net namespace, so it will
        never exit while the socket is open.  However, kernel sockets do not take a
        reference to their net namespace, so it may begin exiting while the kernel
        socket is still open.  In this case if the kernel socket is a tcp socket,
        it will stay open trying to complete its close sequence.  The sock's dst(s)
        hold a reference to their interface, which are all transferred to the
        namespace's loopback interface when the real interfaces are taken down.
        When the namespace tries to take down its loopback interface, it hangs
        waiting for all references to the loopback interface to release, which
        results in messages like:
        
        unregister_netdevice: waiting for lo to become free. Usage count = 1
        
        These messages continue until the socket finally times out and closes.
        Since the net namespace cleanup holds the net_mutex while calling its
        registered pernet callbacks, any new net namespace initialization is
        blocked until the current net namespace finishes exiting.
        
        After this change, the tcp socket notices the exiting net namespace, and
        closes immediately, releasing its dst(s) and their reference to the
        loopback interface, which lets the net namespace continue exiting.
        
        Link: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1711407
        Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=97811
        Signed-off-by: Dan Streetman 
        Signed-off-by: David S. Miller 
        Signed-off-by: Greg Kroah-Hartman 
    

    업그레이드 후 3단계를 다시 시도하여 오류가 발생하지 않음

    검증


    생산 환경에서 운영체제kernel을 4.4.114로 업그레이드했지만 여전히 문제가 발견되었다.이 가능하다, ~할 수 있다,...eth0?

    후속


    계속 기다리다

    좋은 웹페이지 즐겨찾기