Skip to content

Instantly share code, notes, and snippets.

@analysisjp
Last active February 12, 2024 02:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save analysisjp/ee77b26dc83e1457a9e72c707b62075f to your computer and use it in GitHub Desktop.
Save analysisjp/ee77b26dc83e1457a9e72c707b62075f to your computer and use it in GitHub Desktop.
Fixed memory leak issue in Ubuntu 22.04 environment (stable-diffusion-webui-forge)
From 84749342c93491d829da65d9c89a7af94a9469b2 Mon Sep 17 00:00:00 2001
From: supercat <supercat@gmail.com>
Date: Tue, 6 Feb 2024 23:17:14 +0900
Subject: [PATCH] Fixed memory leak issue in Ubuntu 22.04 or modern linux
environment
---
webui.sh | 70 +++++++++++++++++++++++++++++++++++++-------------------
1 file changed, 47 insertions(+), 23 deletions(-)
diff --git a/webui.sh b/webui.sh
index 25b94906..2ac305af 100755
--- a/webui.sh
+++ b/webui.sh
@@ -226,33 +226,57 @@ fi
# Try using TCMalloc on Linux
prepare_tcmalloc() {
if [[ "${OSTYPE}" == "linux"* ]] && [[ -z "${NO_TCMALLOC}" ]] && [[ -z "${LD_PRELOAD}" ]]; then
- # Define Tcmalloc Libs arrays
- TCMALLOC_LIBS=("libtcmalloc(_minimal|)\.so\.\d" "libtcmalloc\.so\.\d")
-
- # 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
- printf "\e[1m\e[31mCannot locate TCMalloc (improves CPU memory usage)\e[0m\n"
- fi
- done
+ # check glibc version
+ LIBC_LIB="$(PATH=/usr/sbin:$PATH ldconfig -p | grep -P "libc.so.6" | head -n 1)"
+ LIBC_INFO=$(echo ${LIBC_LIB} | awk '{print $NF}')
+ LIBC_VER=$(echo $(${LIBC_INFO} | awk 'NR==1 {print $NF}') | grep -oP '\d+\.\d+')
+ echo "glibc version is $LIBC_VER"
+ vernum=$(expr $LIBC_VER)
+ # Since 2.34 libpthread is integrated into libc
+ libc_v234=2.34
+
+ if [ $(echo "$vernum < $libc_v234" | bc) -eq 1 ]; then
+ # glibc < 2.33 ptthread_Key_Create into libpthead.so
+ # Define Tcmalloc Libs arrays
+ TCMALLOC_LIBS=("libtcmalloc(_minimal|)\.so\.\d" "libtcmalloc\.so\.\d")
+
+ # 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)"
+ echo ${TCMALLOC}
+ 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 libpthread will trigger undefined symbol: pthread_Key_Create error"
+ fi
+ else
+ printf "\e[1m\e[31mCannot locate TCMalloc (improves CPU memory usage)\e[0m\n"
+ fi
+ done
+
+ else
+ # glibc >= 2.34 pthread_Key_Create into libc.so (ubuntu 22.04 and modern linux system)
+ TCMALLOC="$(PATH=/sbin:$PATH ldconfig -p | grep -Po "libtcmalloc(_minimal|)\.so\.\d" | head -n 1)"
+ if [[ ! -z "${TCMALLOC}" ]]; then
+ echo "Using TCMalloc: ${TCMALLOC}"
+ export LD_PRELOAD="${TCMALLOC}"
+ else
+ printf "\e[1m\e[31mCannot locate TCMalloc (improves CPU memory usage)\e[0m\n"
+ fi
+ fi
fi
}
+
KEEP_GOING=1
export SD_WEBUI_RESTART=tmp/restart
while [[ "$KEEP_GOING" -eq "1" ]]; do
--
2.34.1
@analysisjp
Copy link
Author

tcmalloc is included in google-perftools and must be installed.

'''
$ sudo apt install google-perftools
'''

@analysisjp
Copy link
Author

@analysisjp
Copy link
Author

イリヤちゃんにプルリクしたんやが手下のサーヴァントに「んなもんA1111に言うてくれや」言われて駄目でしたわとほほ😿
なんやあいつらは身内でチャプチャプしたいんやろかね😾

ということで、このパッチを自分で当ててもらうか、パッチ当てるん嫌なら「webui-user.sh」に
LD_PRELOAD="/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4"
って書き足さないと何か画像生成のたびにメモリ圧迫してそのうちOOMで堕ちるから注意してな

@analysisjp
Copy link
Author

本家A1111のほうへプルリクしたわ
なぜTcmallocが必要か理由も書いといたからまた見たってや
AUTOMATIC1111/stable-diffusion-webui#14883

ただ、春節だからもしかしたら見てくれるの遅いかもな〜

しかしまぁ箱みかんニキの提案も本家に云うてくれいうとるし、なんかそういう覚悟でforkしたわけじゃなさそうやねあの人たち
lllyasviel/stable-diffusion-webui-forge#151

@analysisjp
Copy link
Author

ええ話や
A1111のDevにマージされたわ
今後このパッチはいらんようになるかもな

@analysisjp
Copy link
Author

forgeのmainブランチに目出度く反映されたようや
もうこのglistは用済みなんで消してもええんやが記録のために残しとくわ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment