Unverified Commit 4d563830 authored by fuchen.ljl's avatar fuchen.ljl Committed by GitHub
Browse files

Long distance memory overflow issue

Problem: The memory will slowly increase with the drawing until restarting.
Observation: GC analysis shows that no occupation has occurred, so it is suspected to be a problem with the underlying allocator.
Reason: Under Linux, glibc is used to allocate memory. glibc uses brk and mmap to allocate memory, and the memory allocated by brk cannot be released until the high-address memory is released. That is to say, if you apply for two pieces of memory A and B through brk, it is impossible to release A before B is released, and it is still occupied by the process. Check the suspected "memory leak" through TOP.
So I replaced TCMalloc, but found that libtcmalloc_minimal could not find ptthread_Key_Create. After analysis, it was found that pthread was not entered during compilation.
parent 42dbcad3
Loading
Loading
Loading
Loading
+23 −7
Original line number Original line Diff line number Diff line
@@ -222,13 +222,29 @@ fi
# Try using TCMalloc on Linux
# Try using TCMalloc on Linux
prepare_tcmalloc() {
prepare_tcmalloc() {
    if [[ "${OSTYPE}" == "linux"* ]] && [[ -z "${NO_TCMALLOC}" ]] && [[ -z "${LD_PRELOAD}" ]]; then
    if [[ "${OSTYPE}" == "linux"* ]] && [[ -z "${NO_TCMALLOC}" ]] && [[ -z "${LD_PRELOAD}" ]]; then
        TCMALLOC="$(PATH=/usr/sbin:$PATH ldconfig -p | grep -Po "libtcmalloc(_minimal|)\.so\.\d" | head -n 1)"
        # Define Tcmalloc Libs arrays
        if [[ ! -z "${TCMALLOC}" ]]; then
        TCMALLOC_LIBS=("libtcmalloc(_minimal|)\.so\.\d" "libtcmalloc\.so\.\d")
            echo "Using TCMalloc: ${TCMALLOC}"

            export LD_PRELOAD="${TCMALLOC}"
        # Traversal array
        for lib in "${TCMALLOC_LIBS[@]}"
        do
          #Determine which type of tcmalloc library the library supports
          TCMALLOC="$(PATH=/usr/sbin:$PATH ldconfig -p | grep -P $lib | head -n 1)"
          TC_INFO=(${TCMALLOC//=>/})
          if [[ ! -z "${TC_INFO}" ]]; then
              echo "Using TCMalloc: ${TC_INFO}"
              #Determine if the library is linked to libptthread and resolve undefined symbol: ptthread_Key_Create
              if ldd ${TC_INFO[2]} | grep -q 'libpthread'; then
                echo "$TC_INFO is linked with libpthread,execute LD_PRELOAD=${TC_INFO}"
                export LD_PRELOAD="${TC_INFO}"
                break
              else
                echo "$TC_INFO is not linked with libpthreadand will trigger undefined symbol: ptthread_Key_Create error"
              fi
          else
          else
              printf "\e[1m\e[31mCannot locate TCMalloc (improves CPU memory usage)\e[0m\n"
              printf "\e[1m\e[31mCannot locate TCMalloc (improves CPU memory usage)\e[0m\n"
          fi
          fi
        done
    fi
    fi
}
}