Logo

Personal Ops Runbook

Personal runbook covering infrastructure operations for Cloud, Kubernetes, OpenStack, and Ceph environments. Includes deployment and teardown procedures, node management, cluster monitoring setup, and incident response workflows compiled from day-to-day operational work. Intended strictly for personal reference — configurations and scripts are environment-specific and not guaranteed to work as-is elsewhere.

RUNBOOK — OSD Segfault trong OSD::tick_without_osd_lock() (thread safe_timer)

Thông tin Giá trị
Mã runbook CEPH-RB-001
Áp dụng cho Ceph Squid 19.2.0 → 19.2.3 (đã xác nhận trên 19.2.1, 19.2.2, 19.2.3)
Cluster liên quan SOC-CEPH-PUB-C11 (fsid 57674c00-ca97-11f0-baeb-4b6020ebcfd0, ceph 19.2.3, cephadm/podman)
Mức độ Minor — crash đơn lẻ, OSD tự phục hồi, không mất dữ liệu
Trạng thái bug Đã có fix chính thức trong v19.2.4
Ngày lập 2026-08-09
Sự cố tham chiếu osd.3 crash lúc 2026-08-07T19:01:55Z (02:01 sáng 08/08 giờ VN) trên host SOC-CEPH-PUB-C11-OSD-221

1. Mô tả bug

Race condition trong ceph-osd: thread timer (safe_timer) chạy OSD::tick_without_osd_lock() mỗi giây, trong đó gọi OSDSuperblock::get_newest_map() để đọc danh sách epoch osdmap (superblock.maps, kiểu interval_set backed by std::map). Nếu đúng thời điểm đó một thread khác đang chạy trim_maps (xóa các osdmap epoch cũ, trigger qua handle_osd_map), std::map bị sửa đổi và truy cập đồng thời không có mutex bảo vệ → iterator hỏng → SIGSEGV tại std::_Rb_tree_decrement.

Vì cửa sổ race chỉ vài mili-giây và trim_maps không chạy thường xuyên, crash mang tính ngẫu nhiên, hiếm, không phụ thuộc tải, và thường chỉ xảy ra một lần rồi thôi trên mỗi OSD.

2. Dấu hiệu nhận biết (signature)

Crash được xác nhận là bug này khi backtrace có đủ 3 frame sau, trong thread safe_timer:

2: (std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)+0xe)
3: (OSD::tick_without_osd_lock()+0x...)
5: (CommonSafeTimer<std::mutex>::timer_thread()+0x...)

Dấu hiệu kèm theo:

  • ceph -s báo HEALTH_WARN: N daemons have recently crashed.
  • ceph crash info <id> cho process_name: ceph-osd, backtrace như trên. Stack_sig ghi nhận trên cluster này: 75971b2aa27e5b3f7afc8f50cac9183314ed9af715e60bd0cf7eaac43c0eb994.
  • systemd trên host OSD ghi Main process exited, code=exited, status=139 (139 = 128 + SIGSEGV). Lưu ý: nếu là 137 (SIGKILL) thì là OOM kill, KHÔNG phải bug này — xử lý theo hướng memory.
  • OSD tự restart qua systemd sau ~10 giây và chạy lại bình thường, PG trở về active+clean.

3. Quy trình xử lý khi gặp crash

Toàn bộ bước chẩn đoán dưới đây là read-only. Chỉ mục 3.4 có thao tác ghi (archive crash) — thực hiện có chủ đích.

3.1. Xác nhận signature (read-only)

ceph health detail
ceph crash ls
ceph crash info <crash_id>          # đối chiếu backtrace với mục 2

3.2. Xác nhận OSD đã phục hồi (read-only)

ceph -s                              # PG phải đang active+clean, OSD up/in đủ
ceph orch ps | grep osd.<N>          # STATUS running, thời gian uptime mới (vừa restart)

3.3. Loại trừ nguyên nhân phần cứng / OOM (read-only)

Lưu ý múi giờ: timestamp trong ceph crashUTC; host chạy giờ +07. Cộng 7 tiếng khi query journalctl theo giờ local, hoặc dùng --utc.

# Trên host chứa OSD bị crash:
dmesg -T | grep -iE "oom|segfault|error|nvme|mce" | tail -50
journalctl -k --utc --since "<UTC crash - 30m>" --until "<UTC crash + 30m>"
cephadm logs --name osd.<N> | grep -B5 -A30 "<UTC timestamp>"

Kỳ vọng: không có OOM kill, không có disk/NVMe error, không MCE. Nếu CÓ → không phải bug này, chuyển hướng điều tra phần cứng/memory.

3.4. Xóa cảnh báo HEALTH_WARN (thao tác ghi — chỉ chạy sau khi đã xác nhận 3.1–3.3)

ceph crash archive <crash_id>
# hoặc archive toàn bộ: ceph crash archive-all

Thao tác này chỉ đánh dấu "đã xem", không đụng dữ liệu.

3.5. Khi nào cần leo thang (escalate)

Bình thường bug này KHÔNG cần can thiệp thêm. Leo thang lên team lead / lên kế hoạch nâng cấp khẩn nếu:

  • Cùng một OSD crash lặp lại nhiều lần trong ngày (bug này gần như không lặp nhanh như vậy — pattern crash-loop vài phút một lần giống các đợt osd.15 tháng 4/2026 và osd.20 tháng 6/2026 cần điều tra riêng, so sánh stack_sig trước khi kết luận cùng nguyên nhân).
  • Nhiều OSD crash cùng lúc trên cùng host (nghi vấn host-level: RAM, kernel, disk).
  • Backtrace KHÔNG khớp signature ở mục 2.
  • PG không trở về active+clean sau khi OSD restart.

4. Fix triệt để

Nâng cấp lên Ceph v19.2.4 hoặc mới hơn. Không có workaround nào trên 19.2.3 (không có tham số config nào tắt được race này).

Lý do nâng cấp còn cấp bách hơn bản thân bug segfault: 19.2.0–19.2.3 chứa bug silent data corruption trên OSD khi bluestore_elastic_shared_blobs bật (mặc định) — tracker #70390, đã vá trong 19.2.4. Một lần nâng cấp giải quyết cả hai vấn đề.

Sau nâng cấp: theo dõi ceph crash ls trong 2–4 tuần; không kỳ vọng thấy lại signature này.

5. Theo dõi trong lúc chờ nâng cấp

  • Định kỳ (hàng ngày/tuần): ceph crash ls — nếu xuất hiện crash mới cùng stack_sig trên nhiều OSD với tần suất tăng, đẩy nhanh lịch nâng cấp.
  • Không cần bật debug log hay thu coredump cho bug này — RCA đã hoàn tất, ticket upstream đã đóng, không cần báo cáo thêm.

6. Link tham chiếu (bug trackers & PRs)

Loại Link Ghi chú
Bug gốc (RCA) https://tracker.ceph.com/issues/66819 "Segmentation fault in OSD::tick_without_osd_lock()" — RADOS, status Resolved. Chứa phân tích coredump và log chứng minh race giữa tick và trim_maps
Ticket duplicate https://tracker.ceph.com/issues/72360 Cùng crash trên 19.2.2, đánh dấu duplicate của #66819
Backport Squid https://tracker.ceph.com/issues/72070 "squid: Segmentation fault in OSD::tick_without_osd_lock()" — Resolved
Backport Tentacle https://tracker.ceph.com/issues/72071 Cho nhánh v20 — Resolved
PR fix trên main https://github.com/ceph/ceph/pull/62916 "osd: Access/Modify epoch maps under mutex in OSDSuperblock class"
PR backport vào 19.2.4 https://github.com/ceph/ceph/pull/64732 Bản Squid của PR trên, có trong changelog 19.2.4
Release notes 19.2.4 https://ceph.io/en/news/blog/2026/v19-2-4-squid-released/ Phát hành 01/06/2026, chứa fix này
Bug corruption liên quan https://tracker.ceph.com/issues/70390 Silent corruption với elastic shared blobs trên 19.2.0–19.2.3 — lý do chính để ưu tiên nâng cấp 19.2.4
Báo cáo cộng đồng cùng signature https://forum.proxmox.com/threads/osd-segmentation-faults-safe_timer.181598/ Cluster khác chạy 19.2.3, backtrace giống hệt, "vài ngày một OSD crash rồi tự phục hồi"

7. Ghi chú vận hành riêng cho cluster này

  • Memory: osd_memory_target_autotune = true; target thực per-host ~43.8 GiB (host 221/223/224) và ~50 GiB (host 222) — giá trị global 4 GiB bị override, RSS 25–27 GiB/OSD là bình thường, không phải leak.
  • Journald trên host OSD đang để Storage=auto (kernel log không persistent qua journalctl) — khi cần tra kernel log lúc sự cố, dùng dmesg -T. Cân nhắc bật Storage=persistent trong maintenance window.
  • Lệnh ceph daemon osd.N ... phải chạy trong container: cephadm enter --name osd.N hoặc dùng ceph tell osd.N ... từ node mon (tương đương, tiện hơn).