随机段错误和 Python 错误 - Ubuntu 22.04 LTS

随机段错误和 Python 错误 - Ubuntu 22.04 LTS

我在一台 Ubuntu 服务器上遇到了无法解释的随机分段错误和 Python 错误。我无法在任何其他服务器或我的开发计算机上重现这些错误。我试图弄清楚这是否与软件相关(外部库或我自己的代码)或硬件相关。

这些问题是在不到一个月前开始出现的,我一直在尝试一切能想到的方法来解决它。

有问题的服务器具有以下操作系统/内核/硬件/配置:

  • 操作系统:Ubuntu 22.04.2 LTS
  • 核心:5.19.0-46-通用
  • 记忆:2x16GB DDR4 @ 3200MHz
  • 中央处理器:i9-13900K @ 3GHz
  • 图形处理器:RTX 4080 16GB
  • 贮存:250GB NVMe Sandisk SN770
  • 交换功能已禁用。注意:最初并未被禁用,这是造成故障的部分原因。

在运行 Ubuntu 20 或 22 或使用 Linux Kernel 5.15 或 5.19 时,我无法在健康的服务器上重现错误。

我无法展示代码库中的确切代码示例 - 我知道这会让帮助变得更加困难,但任何指示都会非常感激。代码库具有以下外部依赖项:

  1. opencv-python-headless
  2. numpy
  3. scipy
  4. scikit-learn
  5. 火炬
  6. 火炬视觉
  7. 变压器
  8. fastapi
  9. 网络套接字
  10. 要求
  11. 谷歌云存储
  12. google-cloud-pubsub
  13. firebase 管理员
  14. 枕头
  15. 洛古鲁
  16. 优维康

在有问题的服务器上,我有 14 个 kubernetes pod - 由 5 个唯一 pod 组成,它们为剩余的 9 个“客户端”pod 运行服务。故障可能发生在任何 pod 中,但当所有 pod 都在运行时,最常发生在 9 个客户端 pod 中。启动 pod 时,唯一 pod 有时会遇到分段故障,但最终会稳定下来。

客户端 pod 遇到分段故障的时间间隔不定 - 可能在 15 分钟到 15 小时之间发生。客户端 pod 可能在内部处于空闲状态,也可能正在处理中。

独特的 pod 在成功启动后很少会遇到分段错误 - 在 24 小时到 48 小时之间。

Systemd、AppArmor 和 Apport 也都遇到过分段错误 - 虽然只有一两次。前几天我的整个服务器也死锁了,我不得不运行sudo systemctl --force --force reboot强制服务器重新启动,因为sudo reboot now它拒绝工作。

从软件方面来看,我发现有问题的服务器与健康的服务器之间存在一个主要差异。有问题的服务器有一个 GPU,并使用 CUDA 和 nvidia-container-runtime,而健康的服务器则有较小的专用 GPU 服务器(nvidia Jetsons),通过 SSH 隧道与其连接。

我的开发计算机有 GPU、CUDA 和 nvidia-container-runtime,但没有遇到与有问题的服务器相同的故障。

关于 Python 故障 - 说实话,除了某些外部因素改变了现有对象的内存之外,我无法解释它们。我遇到过MemoryErrors、、、和。SystemErrorsUnboundLocalErrorsTypeErrorsAttributeErrorsLookupErrors

我的一些 Python 对象被传递给了不应该接收它们的函数,并且在我的 Python 代码中从未将它们提供给它们。例如:

  • ObjectA存储了 的各种子类实例ObjectBs
  • FunctionAObjectB将其或其任何子类的实例作为关键字参数。FunctionA已禁用位置参数。
  • FunctionA在尝试访问实例及其子类中存在的实例变量时,在其调用中接收到的实例ObjectA而不是的实例,从而ObjectB导致。AttributeErrorFunctionAObjectB
  • ObjectA从未传递到FunctionA代码库中——这是肯定的。
  • FunctionA每秒被调用 10 到 20 次。

上述情况我曾经见过一次。我还见过其他情况:

File "/usr/local/lib/python3.11/urllib/request.py", line 2521, in getproxies_environment
  for name, value in os.environ.items():
File "<frozen _collections_abc>", line 861, in __iter__
File "<frozen os>", line 680, in __getitem__
File "<frozen os>", line 761, in decode
LookupError: unknown error handler name 'ʚ;'

---

File "/my-repo/.my-venv/lib/python3.11/site-packages/src/subpkg1/subpkg1a/module1.py", line 99, in get_name
    for variable_name, variable in self.__dict__.items():
TypeError: 'dict_itemiterator' object is not callable

---

File "/my-repo/.my-venv/lib/python3.11/site-packages/src/subpkg1/subpkg1b/module2.py", line 136, in _validate_object
callback = self.on_validate_object(call_object)
SystemError: error return without exception set

---

File "/my-repo/.my-venv/lib/python3.11/site-packages/src/subpkg2/subpkg2a/module3.py", line 157, in jsonify_self
    return deepcopy(self.__dict__)
  File "/usr/local/lib/python3.11/copy.py", line 128, in deepcopy
    def deepcopy(x, memo=None, _nil=[]):
SystemError: unknown opcode

---

File "/my-repo/.my-venv/lib/python3.11/site-packages/src/subpkg1/subpkg1b/module2.py", line 52, in __call__
    logger.trace(f"Check called on {type(self).__name__}.")
File "/my-repo/.my-venv/lib/python3.11/site-packages/loguru/_logger.py", line 2006, in trace
    __self._log("TRACE", False, __self._options, __message, args, kwargs)
File "/my-repo/.my-venv/lib/python3.11/site-packages/loguru/_logger.py", line 1886, in _log
    raise ValueError("Level '%s' does not exist" % level) from None
ValueError: Level 'TRACE' does not exist

 - NB: This particular logging statement happens hundreds of times per second.

---

SystemError: Objects/dictobject.c:2509: bad argument to internal function

这些只是我选择的一些 - 因此我遇到了各种我无法解释的错误。以下是一些 GDB/faulthandler 跟踪:

#0  0x0000000000000000 in ?? ()
#1  0x00007ffff3197193 in PyArray_TransferNDimToStrided ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so
#2  0x00007ffff31bc56c in npyiter_copy_to_buffers ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so
#3  0x00007ffff31b760a in npyiter_buffered_iternext ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so
#4  0x00007ffff321f6b6 in execute_ufunc_loop ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so
#5  0x00007ffff32275c5 in ufunc_generic_fastcall ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so
#6  0x00005555556b0914 in ?? ()
#7  0x00005555556b0803 in PyObject_CallFunctionObjArgs ()
#8  0x00007ffff31cbace in array_multiply ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so
#9  0x00005555556dc1c8 in PyNumber_Multiply ()
#10 0x000055555569a3c4 in _PyEval_EvalFrameDefault ()
#11 0x00005555556b14ec in _PyFunction_Vectorcall ()
#12 0x0000555555699c14 in _PyEval_EvalFrameDefault ()
#13 0x00005555556b14ec in _PyFunction_Vectorcall ()
#14 0x000055555569ad6b in _PyEval_EvalFrameDefault ()
#15 0x00005555556bef11 in ?? ()
#16 0x000055555569ad6b in _PyEval_EvalFrameDefault ()
#17 0x00005555556bef11 in ?? ()
#18 0x000055555569ad6b in _PyEval_EvalFrameDefault ()
#19 0x00005555556b14ec in _PyFunction_Vectorcall ()
#20 0x0000555555699c14 in _PyEval_EvalFrameDefault ()
#21 0x00005555556bef11 in ?? ()
#22 0x000055555569ad6b in _PyEval_EvalFrameDefault ()
#23 0x00005555556b14ec in _PyFunction_Vectorcall ()
--Type <RET> for more, q to quit, c to continue without paging--c
#24 0x0000555555699c14 in _PyEval_EvalFrameDefault ()
#25 0x00005555556b14ec in _PyFunction_Vectorcall ()
#26 0x0000555555699a1d in _PyEval_EvalFrameDefault ()
#27 0x00005555556b14ec in _PyFunction_Vectorcall ()
#28 0x000055555569f75a in _PyEval_EvalFrameDefault ()
#29 0x00005555556b14ec in _PyFunction_Vectorcall ()
#30 0x0000555555699a1d in _PyEval_EvalFrameDefault ()
#31 0x0000555555696176 in ?? ()
#32 0x000055555578bc56 in PyEval_EvalCode ()
#33 0x00005555557b8b18 in ?? ()
#34 0x00005555557b196b in ?? ()
#35 0x00005555557b8865 in ?? ()
#36 0x00005555557b7d48 in _PyRun_SimpleFileObject ()
#37 0x00005555557b7a43 in _PyRun_AnyFileObject ()
#38 0x00005555557a8c3e in Py_RunMain ()
#39 0x000055555577ebcd in Py_BytesMain ()
#40 0x00007ffff7c29d90 in __libc_start_call_main (main=main@entry=0x55555577eb90, argc=argc@entry=16, argv=argv@entry=0x7fffffffddb8) at ../sysdeps/nptl/libc_start_call_main.h:58
#41 0x00007ffff7c29e40 in __libc_start_main_impl (main=0x55555577eb90, argc=16, argv=0x7fffffffddb8, init=<optimised out>, fini=<optimised out>, rtld_fini=<optimised out>, stack_end=0x7fffffffdda8) at ../csu/libc-start.c:392
#42 0x000055555577eac5 in _start ()

---

#0  __pthread_kill_implementation (no_tid=0, signo=11, threadid=140653751431168) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=11, threadid=140653751431168) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=140653751431168, signo=signo@entry=11) at ./nptl/pthread_kill.c:89
#3  0x00007fec80c42476 in __GI_raise (sig=11) at ../sysdeps/posix/raise.c:26
#4  <signal handler called>
#5  0x0000000000000000 in ?? ()
#6  0x00007ffff3197193 in PyArray_TransferNDimToStrided ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so
#7  0x00007ffff31bc56c in npyiter_copy_to_buffers ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so
#8  0x00007ffff31b760a in npyiter_buffered_iternext ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so
#9  0x00007ffff321f6b6 in execute_ufunc_loop ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so
#10  0x00007ffff32275c5 in ufunc_generic_fastcall ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so

#11  0x00005555556b0914 in _PyObject_VectorcallTstate (kwnames=0x0, nargsf=<optimised out>, args=0x7fffffffc2d0,
    callable=<numpy.ufunc at remote 0x7ffff36b4840>, tstate=0x555555b5d960) at ../Include/cpython/abstract.h:114
#12  object_vacall (tstate=0x555555b5d960, base=<optimised out>, callable=<numpy.ufunc at remote 0x7ffff36b4840>,
    vargs=<optimised out>) at ../Objects/call.c:734
#13  0x00005555556b0803 in PyObject_CallFunctionObjArgs (callable=<optimised out>) at ../Objects/call.c:841
#14  0x00007ffff31cbace in array_multiply ()
   from /home/myusername/folder/my-repo/.my-venv/lib/python3.10/site-packages/numpy/core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so
#10 0x00005555556dc1c8 in binary_op1 (op_slot=16, w=<numpy.ndarray at remote 0x7fff287c34b0>,
    v=<numpy.ndarray at remote 0x7fff287c3ed0>) at ../Objects/abstract.c:891
#15 PyNumber_Multiply (v=<numpy.ndarray at remote 0x7fff287c3ed0>, w=<numpy.ndarray at remote 0x7fff287c34b0>)
    at ../Objects/abstract.c:1109
#16 0x000055555569a3c4 in _PyEval_EvalFrameDefault (tstate=<optimised out>, f=<optimised out>, throwflag=<optimised out>)
    at ../Python/ceval.c:2003
#17 0x00005555556b14ec in _PyEval_EvalFrame (throwflag=0,
    f=Frame 0x7ffee801a980, for file /home/myusername/folder/my-repo/src/subpkg3/mask.py, line 122, in mask_array (self=<Mask(_is_frozen=False, mask=<numpy.ndarray at remote 0x7fff287c3810>) at remote 0x7fff402c7580>, array=<numpy.ndarray at remote 0x7fff287c3ed0>, mask=<numpy.ndarray at remote 0x7fff287c3bd0>),
    tstate=0x555555b5d960) at ../Include/internal/pycore_ceval.h:46
--Type <RET> for more, q to quit, c to continue without paging--

---

Current thread 0x00007f08e4408740 (most recent call first):
  File "/my-repo/.my-venv/lib/python3.9/site-packages/src/subpkg3/module7.py", line 122 in mask_array
  File "/my-repo/.my-venv/lib/python3.9/site-packages/src/subpkg4/module6.py", line 674 in get_object
  File "/my-repo/.my-venv/lib/python3.9/site-packages/src/subpkg1/module5.py", line 362 in _run_iteration
  File "/my-repo/.my-venv/lib/python3.9/site-packages/src/subpkg1/module5.py", line 432 in _run
  File "/my-repo/.my-venv/lib/python3.9/site-packages/src/subpkg1/module5.py", line 531 in activate
  File "/my-repo/run_headless.py", line 81 in run_headless_main
  File "/my-repo/run_headless.py", line 179 in <lambda>
  File "/my-repo/run_headless.py", line 129 in main
  File "/my-repo/run_headless.py", line 202 in <module>
Segmentation fault (core dumped)
make: *** [Makefile:125: run] Error 139

我尝试过的方法

  1. 直接从 Python 版本 3.8、3.9、3.10 和 3.11 中的源代码运行。
  2. 在 docker 中运行。
  3. 在无根docker中运行。
  4. 在 microk8s 中运行。
  5. 使用基础 Docker镜像python3.11:slim-bookworm、、python3.11:slim-bullseyepython3.9:slim-bookwormpython3.9:slim-bullseye
  6. 关闭 GDB 先前捕获到分段错误的代码部分。
  7. 生成一个与我的代码库分开的应用程序来查看是否发生故障 - 一个故障发生在导入 numpy 时。
  8. 在容器内使用 root 用户和普通用户。
  9. 回滚到我的代码库的早期版本。
  10. 重新安装服务器操作系统。
  11. 将客户端 Pod 数量缩减为 1 个,然后逐渐增加。我在单个客户端 Pod 上遇到了故障。
  12. 比较健康服务器和问题服务器之间安装的 apt 软件包。它们共享的软件包版本全部相同。问题服务器安装了大量与 nvidia 相关的软件包,而健康服务器没有安装(、CUDAlibnvidialibcurandnvidia-container等)。nvidia-drivernvidia-kernel
  13. 使用 memtester 和 Stress 进行内存测试 - 均未发现任何错误。
  14. 监控资源以查找突然的峰值/内存泄漏等。服务器的内存使用量始终为 7GB。大多数 CPU 核心的使用率为 12%,有些甚至高达 40%,温度始终为 45-60C。GPU 上的 2GB VRAM 始终处于使用状态,温度始终为 48-57C。

最后(可能不相关),服务器的系统日志包含以下条目:

Jul 12 18:09:56 hostname kernel: [  542.966210] systemd-journald[545]: Failed to send WATCHDOG=1 notification message: Transport endpoint is not connected

---

Jul 13 16:19:47 hostname kernel: [77765.893975] python[3937030]: segfault at 0 ip 0000000000000000 sp 00007ffe617d0f98 error 14 in python3.11[55e903651000+1000]
Jul 13 16:19:47 hostname kernel: [77765.893983] Code: Unable to access opcode bytes at RIP 0xffffffffffffffd6.

 - NB: Whenever a seg fault happens in one of the containers, a syslog statement similar to above always occurs with error 4, 5, 14 or 15.

希望我已经给出了足够的细节,但我知道如果不看我的代码并且不从跟踪中删除识别信息,这会很困难。

谢谢。

答案1

这是因为运行操作系统的 SSD 坏了。它的额定容量为 200TBW,在 4 个月内执行了 250TB 的写入操作。

确保在使用 Kubernetes/microk8s/k3s 时禁用交换,否则你会像我一样损坏你的 SSD。

在这 4 个月中,我有 2 个月都在使用 docker/docker compose,因此禁用交换可能也是一个好主意。

要禁用交换运行sudo swapoff -a

答案2

在 i9-13000K 上使用 NumPy 时,我也遇到了类似的随机段错误/内核恐慌。

关闭 Turbo Boost 技术 (TBT) 或降低时钟频率将会降低段错误的频率。

更换新的免费替代芯片也降低了段错误的频率(启用TBT),但随机段错误仍然存​​在。

相关内容