python / python/cpython

`test_profiling` sometimes times out under TSan

未關閉
#143,442 2 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

tests topic-profiling type-bug
主要語言
Python
星號
77.2k
分支
36k
PR 合併指標
PR 指標待擷取

描述

We don't currently run test_profiling in the TSan CI, but the context is that I'm trying to get the entire test suite running under thread sanitizer (TSan).

Some of the tests in test_profiling fail to attach in time when run with thread sanitizer, because the sanitizer makes everything slower. This is especially the case when running tests in parallel with -j.

Here's a example:

ERROR: test_run_failed_script_live (test.test_profiling.test_sampling_profiler.test_live_collector_ui.TestLiveModeErrors.test_run_failed_script_live)
Test that running a failing script exits with clean error.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/sgross/tsan-cpython/Lib/profiling/sampling/cli.py", line 279, in _run_with_sync
    _wait_for_ready_signal(sync_sock, process, _SYNC_TIMEOUT_SEC)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/sgross/tsan-cpython/Lib/profiling/sampling/cli.py", line 223, in _wait_for_ready_signal
    raise socket.timeout("timed out")
TimeoutError: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/sgross/tsan-cpython/Lib/profiling/sampling/cli.py", line 1110, in _handle_live_run
    process = _run_with_sync(cmd, suppress_output=True)
  File "/home/sgross/tsan-cpython/Lib/profiling/sampling/cli.py", line 289, in _run_with_sync
    raise RuntimeError(
        "Process failed to signal readiness within timeout"
    )
RuntimeError: Process failed to signal readiness within timeout

I think the problem is that the the _SYNC_TIMEOUT_SEC of 5 seconds isn't enough in this case:

https://github.com/python/cpython/blob/4f9a8d075ee52b8f56aca14102c8bf9fd6f3c512/Lib/profiling/sampling/cli.py#L78

Here are some options to consider:

  1. Make _SYNC_TIMEOUT_SEC configurable via a command line option and specify a larger value for the tests (i.e., SHORT_TIMEOUT)
  2. Make _SYNC_TIMEOUT_SEC configurable via environment variable
  3. Skip these tests under TSan
  4. ???

cc @pablogsal

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

研究方向

從 Lib/profiling/sampling/cli.py 中的 _SYNC_TIMEOUT_SEC 和 _wait_for_ready_signal 開始,然後檢查失敗的 test_profiling 案例 test_run_failed_script_live。在 TSan 下執行 profiling 測試,包括使用 -j 平行執行,並比較現有測試中針對 sanitizer 特定行為的慣例。完成的標準是受影響的測試能在 TSan 下可靠完成,同時不削弱正常的測試涵蓋率。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
python
領域
performance, testing
Issue 類型
缺陷
難度
4/5
預估耗時
3-5 天
活躍度
停滯
描述清晰度
基本清楚
新手友好度
38/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。