拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Ceph cephadm 故障排查指南:容器化守护进程的日志、事件、SSH 与调试全流程

存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载导读cephadm 将 Ceph 的所有守护进程部署在容器中因此排查容器化守护进程问题的方法与传统基于软件包的部署方式截然不同。本文以官方 doc/cephadm/troubleshooting.rst 为骨架结合 cephadm 源码src/cephadm/cephadm.py、src/pybind/mgr/cephadm/module.py与配套运维文档 doc/cephadm/operations.rst系统讲解如何暂停/禁用 cephadm、如何按服务或守护进程查看事件、如何通过 journald 与cephadm logs收集日志、如何排查 SSH 连接与 CIDR 推断错误、如何访问 admin socket、如何在加密 OSD 上运行 store 工具、如何恢复 Monitor 法定人数、手动部署 Manager以及利用 gdb 对 core dump 和实时进程进行调试。读完本文你将掌握一套从症状定位 → 日志取证 → 底层修复 → 深度调试的完整排查方法。容器化架构下的排查思路差异cephadm 在容器中部署守护进程mon、mgr、osd、mds、rgw 等这使得故障排查的思路与传统包管理部署有本质区别守护进程的日志默认由容器运行时捕获并写入journald不再出现在/var/log/ceph/下详见 doc/cephadm/operations.rst 的 Ceph Daemon Logs 一节每个守护进程由一个 systemd 单元unit管理单元名形如ceph-fsiddaemon-name.service查看其状态、停止、启动都通过该单元进行运行中的容器由 Podman/Docker 管理需要能列出容器镜像、手动进入容器或手工重放容器的启动命令集群编排动作由 cephadm 模块mgr侧的 Python 模块调度因此排查编排问题往往需要同时看集群侧事件与主机侧日志两个维度。下文所有命令均假定你在具备 cephadm 能力的管理主机上执行。暂停或禁用 Cephadm当 cephadm 行为异常、需要先稳住集群时有两种降级手段暂停pause和禁用disable。暂停冻结编排动作ceph orch pause该命令停止 Ceph 集群中绝大部分后台变更活动但 cephadm 仍会周期性地检查主机刷新其守护进程与设备的清单inventory。从源码看暂停状态存储在 mgr 模块的 store 中——src/pybind/mgr/cephadm/module.py 的pause()方法会执行self.set_store(pause, true)调度循环据此跳过部署与编排动作。禁用彻底关闭 cephadm如果暂停仍不够可以完全禁用 cephadmceph orch set backend ceph mgr module disable cephadm这两条命令会禁用所有ceph orch ...CLI 命令。已经部署的守护进程容器会继续运行重启后也会按原样拉起——禁用只影响编排不影响运行。提示如果只想暂停单个服务的编排可参考 doc/cephadm/services/index.rst 等章节中关于 unmanaged非托管服务规格的说明。按服务与按守护进程查看事件为了便于定位失败守护进程cephadm 会分别保存服务级事件与守护进程级事件。这些事件往往包含与故障直接相关的信息是排查的第一步。列出服务事件ceph orch ls --service_nameservice-name --format yaml返回内容形如示例中alertmanager服务因目标主机不存在而应用失败service_type: alertmanager service_name: alertmanager placement: hosts: - unknown_host status: ... running: 1 size: 1 events: - 2021-02-01T08:58:02.741162 service:alertmanager [INFO] service was created - 2021-02-01T12:09:25.264584 service:alertmanager [ERROR] Failed to apply: Cannot place AlertManagerSpec for service_namealertmanager on unknown_host: Unknown hosts事件行由时间戳、作用域service:或daemon:、级别[INFO]/[ERROR]/[WARN]等和消息正文组成。[ERROR]级事件通常是故障的直接原因描述。列出守护进程事件ceph orch ps --service-name service-name --daemon-id daemon-id --format yaml返回内容形如daemon_type: mds daemon_id: cephfs.hostname.ppdhsz hostname: hostname status_desc: running ... events: - 2021-02-01T08:59:43.845866 daemon:mds.cephfs.hostname.ppdhsz [INFO] Reconfigured mds.cephfs.hostname.ppdhsz on host hostname排查建议先通过ceph orch ls找到服务级[ERROR]事件再通过ceph orch ps下钻到具体守护进程观察其事件流通常能快速定位谁在什么时候因为什么原因失败。检查 Cephadm 自身日志cephadm 模块自身的运行日志是排查编排问题的另一关键来源实时监控 cephadm 日志方法见 doc/cephadm/operations.rst 的 Watching Cephadm Log Messages 一节文件日志如果集群已配置为将日志写入文件则所有 Monitor 主机上都会存在ceph.cephadm.log文件其完整说明同样见 doc/cephadm/operations.rst 的 Ceph Daemon Logs 一节。收集日志文件默认情况下 cephadm 将日志存放在 journald 中因此在/var/log/ceph/下找不到守护进程日志是正常的。从 doc/cephadm/operations.rst 可知自 Quincy 版本起守护进程默认写入 journald例如查看mon.foo的日志可用journalctl -u ceph-5c5a50ae-272a-455d-99e9-32c6a013e694mon.foo若你更偏好文件日志可以显式开启ceph config set global log_to_file true ceph config set global mon_cluster_log_to_file true查看单个守护进程日志cephadm logs --name name-of-daemon该命令只能在守护进程所在主机上运行。如果目标守护进程在其他主机需要追加--fsid选项cephadm logs --fsid fsid --name name-of-daemon其中fsid是ceph status输出的集群 ID。从 src/cephadm/cephadm.py 的command_logs()实现可以看到该命令底层本质上就是在执行journalctl -u ceph-fsiddaemon-name即直接封装了journalctl -u unit支持追加--command参数透传给 journalctl。批量拉取某主机上所有守护进程的日志fsid$(cephadm shell ceph fsid) for name in $(cephadm ls | jq -r .[].name) ; do cephadm logs --fsid $fsid --name $name $name done该脚本利用cephadm ls列出本机所有由 cephadm 管理的守护进程逐一导出日志到以守护进程名命名的文件中适合在故障现场快速打包取证。收集 Systemd 状态守护进程的 systemd 单元状态可以反映其生命周期问题如反复重启、启动超时、退出码异常。查看单个单元状态systemctl status ceph-$(cephadm shell ceph fsid)service name.service批量导出某主机上所有守护进程的 systemd 状态fsid$(cephadm shell ceph fsid) for name in $(cephadm ls | jq -r .[].name) ; do systemctl status ceph-$fsid$name.service $name done配合journalctl -u ceph-fsiddaemon查看单元日志可以区分容器未启动容器启动后崩溃被 systemd 重启策略反复拉起等不同故障形态。列出主机上所有已下载的容器镜像排查镜像拉取失败镜像版本不一致等问题时需要查看主机上实际存在的容器镜像podman ps -a --format json | jq .[].Image输出示例docker.io/library/centos:8 registry.opensuse.org/opensuse/leap:15.2注意不同容器运行时/版本中该字段可能名为Image或ImageID。若需查看守护进程实际使用的镜像可结合ceph orch ps的image字段以及ceph config get mgr mgr/cephadm/container_image_*等全局镜像配置进行比对。手动重放容器运行命令cephadm 启动容器时使用小的包装脚本wrapper。容器执行命令保存在/var/lib/ceph/cluster-fsid/service-name/unit.run当容器启动异常、需要手工复现启动过程或检查容器参数时直接查看该文件即可例如cat /var/lib/ceph/cluster-fsid/service-name/unit.runSSH 错误排查cephadm 通过 SSH 连接各主机执行部署操作SSH 通道故障是最常见的编排错误之一。典型错误execnet.gateway_bootstrap.HostNotFound: -F /tmp/cephadm-conf-73z09u6g -i /tmp/cephadm-identity-ky7ahp_5 root10.10.1.2 ... raise OrchestratorError(msg) from e orchestrator._interface.OrchestratorError: Failed to connect to 10.10.1.2 (10.10.1.2). Please make sure that the host is reachable and accepts connections using the cephadm SSH key ...出现上述错误时按以下步骤逐步排查 cephadm 与目标主机之间的 SSH 连接。步骤 1确认 cephadm 拥有 SSH 身份密钥[rootmon1 ~]# cephadm shell -- ceph config-key get mgr/cephadm/ssh_identity_key ~/cephadm_private_key INFO:cephadm:Inferring fsid f8edc08a-7f17-11ea-8707-000c2915dd98 INFO:cephadm:Using recent ceph image quay.io/ceph/ceph:v20 obtained mgr/cephadm/ssh_identity_key [rootmon1 ~]# chmod 0600 ~/cephadm_private_key如果该命令失败说明 cephadm 还没有密钥。此时要么生成新密钥[rootmon1 ~]# cephadm shell -- ceph cephadm generate-ssh-key要么从已有私钥导入[rootmon1 ~]# cat ~/cephadm_private_key | cephadm shell -- ceph cephadm set-ssh-key -i -密钥本身以配置项mgr/cephadm/ssh_identity_key的形式存储在集群配置中这也是它需要经cephadm shell访问 Monitor 才能取出的原因。步骤 2确认 SSH 配置正确[rootmon1 ~]# cephadm shell -- ceph cephadm get-ssh-config config导出的config文件即 cephadm 使用的 SSH 客户端配置包含跳板/直连等设置。步骤 3验证能连上目标主机[rootmon1 ~]# ssh -F config -i ~/cephadm_private_key rootmon1能正常登录即说明 SSH 通道本身没有问题若失败则根据报错区分是密钥不被接受、网络不可达还是known_hosts校验失败。验证公钥已列入 authorized_keys确认目标主机的 root 用户接受该公钥[rootmon1 ~]# cephadm shell -- ceph cephadm get-pub-key ~/ceph.pub [rootmon1 ~]# grep cat ~/ceph.pub /root/.ssh/authorized_keysgrep有输出即代表公钥已在授权列表中若为空需要在目标主机上补充授权将公钥追加到/root/.ssh/authorized_keys并设置0600权限。Failed to Infer CIDR Network 错误在部署或新增 Monitor 时若 cephadm 无法从主机网络推断出 CIDR会报以下错误之一ERROR: Failed to infer CIDR network for mon ip ***; pass --skip-mon-network to configure it laterMust set public_network config option or specify a CIDR network, ceph addrvec, or plain IP解决办法是显式设置 Monitor 的公共网络ceph config set mon public_network mon_network其中mon_network是 Monitor 所在网络的 CIDR例如192.168.0.0/24。更完整的多 Monitor 部署与网络配置操作参见 doc/cephadm/services/mon.rst 及相关部署章节。访问 Admin Socket每个 Ceph 守护进程都提供 admin socket支持运行时修改配置与读取统计信息是无需重启即可观测/调参的重要入口。admin socket 的通用说明见 doc/rados/operations/monitoring.rst 的 Using the Admin Socket 一节。进入守护进程容器[rootmon1 ~]# cephadm enter --name daemon-name从 src/cephadm/cephadm.py 的command_enter()实现看该命令会以交互方式-i进入指定守护进程的容器。查看配置与可用动作进入容器后[ceph: rootmon1 /]# ceph --admin-daemon /var/run/ceph/ceph-daemon-name.asok config show [ceph: rootmon1 /]# ceph --admin-daemon /var/run/ceph/ceph-daemon-name.asok helpconfig show打印当前生效配置help列出该 socket 支持的所有命令如config set、dump_ops_in_flight、perf dump等。主机侧路径admin socket 在主机上同样可见位于/var/run/ceph/fsid因此即使不进入容器也可以直接从宿主机执行ceph --admin-daemon /var/run/ceph/fsid/ceph-daemon-name.asok command。运行各种 Ceph 工具ceph-objectstore-tool、ceph-monstore-tool等底层工具需要进入对应守护进程的环境才能运行。标准做法是cephadm shell --name daemon-namecephadm shell会为目标守护进程挂载合适的目录、注入配置与密钥环创建一个适合长时间维护和交互式运行守护进程的环境参见 src/cephadm/cephadm.py 的command_shell()它会根据--name解析出daemon_type/daemon_id并复用该守护进程的专用密钥环。例如导出并打印 monmaprootmyhostname # cephadm unit --name mon.myhostname stop rootmyhostname # cephadm shell --name mon.myhostname [ceph: rootmyhostname /]# ceph-monstore-tool /var/lib/ceph/mon/ceph-myhostname get monmap monmap [ceph: rootmyhostname /]# monmaptool --print monmap monmaptool: monmap file monmap epoch 1 fsid 28596f44-3b56-11ec-9034-482ae35a5fbb last_changed 2021-11-01T20:57:19.7551110000 created 2021-11-01T20:57:19.7551110000 min_mon_release 17 (quincy) election_strategy: 1 0: [v2:127.0.0.1:3300/0,v1:127.0.0.1:6789/0] mon.myhostname在加密 OSD 上运行 Store 工具ceph-objectstore-tool与ceph-bluestore-tool直接操作 BlueStore 的 block 设备它们不会解锁 LUKS也不会打开 dm-crypt 映射。这一步属于 Linux 块设备层由ceph-volume在 OSD 激活activate时完成。因此下列命令在未加密 OSD上可以工作在encrypted: true部署的 OSD 上会失败cephadm unit --name osd.5 stop cephadm shell --name osd.5 -- ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-5 --op list典型失败信息Mount failed with (1) Operation not permitted补充若报错为(11) Resource temporarily unavailable或OSD has the store locked说明ceph-osd仍在运行——请先停止守护进程再使用工具这与是否加密无关。加密 OSD 存储访问的工作原理在加密 LVM OSD 上BlueStore 位于 LUKS 之下。ceph-volume lvm activate打开映射并将 OSD 的block符号链接指向/dev/mapper/lv_uuid而 cephadm 停止 OSD 时会作为 post-stop 动作执行ceph-volume lvm deactivate关闭该映射——这是有意为之OSD 停机期间存储不应在内核中保持解密状态。可以这样理解把 OSD 看作一栋房子LUKS 是门锁。ceph-osd运行时门是开着的cephadm 停止 OSD 时会在离开时锁门。store 工具是管道工——它们能在房子里干活但不随身带钥匙。因此正确流程是先让守护进程停机锁门再重新打开映射开门但不入住然后运行工具。步骤 1停止 OSD在 OSD 主机上cephadm unit --name osd.id stop若主机上没有安装 cephadm直接操作 systemd 单元systemctl stop ceph-fsidosd.id步骤 2找到 OSD UUID即 OSD fsid从集群侧获取ceph osd metadata osd.id | grep osd_fsid或在 OSD 主机上查看 LVM 标签。若主机装有ceph-volume直接运行若安装的是 cephadmcephadm ceph-volume -- lvm list否则使用一次性特权容器IMAGE为 OSD 使用的同一 Ceph 镜像podman与docker等价podman run --rm --privileged --nethost --pidhost --ipchost \ -v /dev:/dev -v /run/udev:/run/udev \ -v /run/lvm:/run/lvm -v /run/lock/lvm:/run/lock/lvm \ -v /etc/ceph:/etc/ceph:z -v /var/lib/ceph:/var/lib/ceph:z \ --entrypoint ceph-volume IMAGE lvm list步骤 3重新打开 dm-crypt 映射但不启动 ceph-osd使用 cephadmcephadm ceph-volume -- lvm activate --no-systemd id osd-uuid或使用同样的一次性容器podman run --rm --privileged --nethost --pidhost --ipchost \ -v /dev:/dev -v /run/udev:/run/udev \ -v /run/lvm:/run/lvm -v /run/lock/lvm:/run/lock/lvm \ -v /etc/ceph:/etc/ceph:z -v /var/lib/ceph:/var/lib/ceph:z \ --entrypoint ceph-volume IMAGE lvm activate --no-systemd id osd-uuidlvm activate需要与 Monitor 通信以获取 LUKS 密钥因此容器内必须能访问集群配置与密钥环典型安装下位于/etc/ceph。若这些文件只存在于/var/lib/ceph/fsid/下请将其绑定挂载到容器内的/etc/ceph。步骤 4运行 store 工具使用 cephadmcephadm shell --name osd.id -- ceph-objectstore-tool --data-path /var/lib/ceph/osd/ceph-id --op list或一次性容器绑定挂载 OSD 数据目录与/dev使block符号链接能到达 mapperpodman run --rm --privileged --pidhost --ipchost \ -v /dev:/dev \ -v /var/lib/ceph/fsid/osd.id:/var/lib/ceph/osd/ceph-id \ --entrypoint ceph-objectstore-tool IMAGE \ --data-path /var/lib/ceph/osd/ceph-id --op listceph-bluestore-tool有相同要求仅在映射打开后才可传--path /var/lib/ceph/osd/ceph-id。步骤 5重新启动 OSD激活是单元启动流程的一部分直接启动即可cephadm unit --name osd.id start未安装 cephadm 时systemctl start ceph-fsidosd.id恢复 Monitor 法定人数如果 Monitormon守护进程无法形成法定人数cephadm 在恢复之前将无法管理集群。恢复思路是将不健康的 Monitor 从 monmap 中移除。停止所有 Monitor。通过 SSH 连接每个 Monitor 所在主机并用 cephadm 停止对应守护进程ssh {mon-host} cephadm unit --name {mon.hostname} stop确定一个幸存的 Monitor登录其主机并进入它的容器ssh {mon-host} cephadm enter --name {mon.hostname}按照 doc/rados/operations/add-or-rm-mons.rst 中从不可恢复健康的 Monitor 中移除 Monitor的步骤操作包括使用monmaptool调整 monmap、重启剩余 Monitor 等。手动部署 Manager 守护进程cephadm 管理集群至少需要一个 Managermgr守护进程。如果最后一个 mgr 被移除可以按以下步骤在集群中任意主机上手动部署一个新的 mgr示例中新 mgr 名为mgr.hostname.smfvfd。禁用 cephadm 调度器防止 cephadm 自动移除新 mgrceph config-key set mgr/cephadm/pause true这与ceph orch pause走的是同一套暂停机制mgr 模块会读取该 store 值判断是否暂停编排。获取或创建新 mgr 的 auth 条目ceph auth get-or-create mgr.hostname.smfvfd mon profile mgr osd allow * mds allow *获取 Monitor 配置ceph config generate-minimal-conf获取容器镜像ceph config get mgr.hostname.smfvfd container_image创建config-json.json包含部署守护进程所需信息{ config: # minimal ceph.conf for 8255263a-a97e-4934-822c-00bfe029b28f\n[global]\n\tfsid 8255263a-a97e-4934-822c-00bfe029b28f\n\tmon_host [v2:192.168.0.1:40483/0,v1:192.168.0.1:40484/0]\n, keyring: [mgr.hostname.smfvfd]\n\tkey V2VyIGRhcyBsaWVzdCBpc3QgZG9vZi4\n }其中config字段来自第 3 步的最小配置keyring字段来自第 2 步的 auth 条目。部署 mgr 守护进程cephadm --image container-image deploy --fsid fsid --name mgr.hostname.smfvfd --config-json config-json.json部署完成后恢复调度将mgr/cephadm/pause取消或置为false并确认ceph orch ps中出现新的 mgr。捕获 Core Dumpcephadm 集群可以配置为捕获守护进程的 core dump。初始捕获与处理由systemd-coredump完成。启用 core dump 处理ulimit -c unlimited注意事项Core dump 不受内核命名空间隔离它们会被写到容器宿主机上的/var/lib/systemd/coredumpulimit -c unlimited仅在系统重启前有效即不是持久化配置等待崩溃再次发生。若要模拟守护进程崩溃例如killall -3 ceph-mon使用 cephadm 运行调试器单次调试会话通过cephadm shell启动调试会话并在 shell 容器内安装调试器与 debuginfo 包。启动 shell 会话挂载 coredump 目录注意正确路径为/var/lib/systemd/coredumpcephadm shell --mount /var/lib/systemd/coredump在 shell 会话内安装调试工具并解压 core 文件dnf install ceph-debuginfo gdb zstdunzstd /var/lib/systemd/coredump/core.ceph-*.zstgdb /usr/bin/ceph-mon /var/lib/systemd/coredump/core.ceph-*.zst在 gdb 提示符下运行调试命令bt示例回溯输出#0 0x00007fa9117383fc in pthread_cond_waitGLIBC_2.3.2 () from /lib64/libpthread.so.0 #1 0x00007fa910d7f8f0 in std::condition_variable::wait(std::unique_lockstd::mutex) () from /lib64/libstdc.so.6 #2 0x00007fa913d3f48f in AsyncMessenger::wait() () from /usr/lib64/ceph/libceph-common.so.2 #3 0x0000563085ca3d7e in main ()重复调试会话cephadm shell每次产生的容器都是临时的会话退出后已安装的软件包即失效。为避免反复安装可构建一个专用调试镜像。创建Containerfilecat Containerfile EOF ARG BASE_IMGquay.io/ceph/ceph:v18 FROM \${BASE_IMG} # install ceph debuginfo packages, gdb and other potentially useful packages RUN dnf install --enablerepo*debug* -y ceph-debuginfo gdb zstd strace python3-debuginfo EOF podman build -t ceph:debugging -f Containerfile . # pass --build-argBASE_IMGyour image to customize the base image上述文件会创建名为ceph:debugging的本地镜像。它可以直接在本机构建调试会话使用也可以推送到容器仓库或保存后复制到运行其他 Ceph 容器的节点相关容器工作流详见podman/docker文档。之后即可反复使用该镜像调试 core 文件cephadm --image ceph:debugging shell --mount /var/lib/systemd/coredump调试实时进程gdb 也可以附加到正在运行的进程进行调试。对容器化进程需要让调试容器与被调试进程处于同一个 PID 命名空间。先生成 cephadm 创建 shell 时使用的容器命令脚本cephadm --image ceph:debugging shell --dry-run /tmp/debug.sh该脚本包含 cephadm 创建 shell 所用的完整容器命令。修改脚本删除--init参数替换为加入运行中容器命名空间的参数。例如要调试 Manager已知其容器名为ceph-bc615290-685b-11ee-84a6-525400220000-mgr-ceph0-sluwsk则使用参数--pidcontainer:ceph-bc615290-685b-11ee-84a6-525400220000-mgr-ceph0-sluwsk然后运行sh /tmp/debug.sh进入调试容器后先用ps找到目标进程的 PID示例中 Manager 进程 PID 为2再在 gdb 中附加attach 2 info threads btinfo threads可查看所有线程bt打印当前线程回溯适合诊断进程卡死、死锁或高 CPU 等问题。排查流程小结综合本文内容容器化 Ceph 集群的典型排查路径可以归纳为稳住局面ceph orch pause暂停编排必要时ceph orch set backend 与ceph mgr module disable cephadm彻底禁用看事件ceph orch ls --service_name svc --format yaml与ceph orch ps --service-name svc --daemon-id id --format yaml定位失败的服务与守护进程取日志cephadm logs --fsid fsid --name daemon底层即journalctl -u ceph-fsiddaemon必要时批量导出所有守护进程日志与systemctl status查通道确认 SSH 密钥ssh_identity_key、SSH 配置get-ssh-config、公钥授权authorized_keys与网络可达性深挖单点cephadm enter --name daemon进入容器使用 admin socketcephadm shell --name daemon运行底层工具注意加密 OSD 需先lvm activate --no-systemd打开映射恢复与控制面法定人数丢失时按 monmap 手术恢复mgr 丢失时手动cephadm deploy崩溃取证开启 core dumpulimit -c unlimited用ceph:debugging镜像配合 gdb 分析 core 文件或附加实时进程。以上所有命令与路径均可在当前仓库中找到对应实现与文档依据doc/cephadm/troubleshooting.rst、doc/cephadm/operations.rst、src/cephadm/cephadm.py、src/pybind/mgr/cephadm/module.py可作为日常运维与问题升级时的操作手册。赞分享存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载相关推荐Vector 故障排查实战指南从日志定位到调试日志的完整排障流程Vector 故障排查实战指南从日志定位到调试日志的完整排障流程 本指南基于 Vector 官方操作文档 website/content/en/guides可观测性数据工程数据集成日志分析Docker引擎守护进程故障排查指南Docker引擎守护进程故障排查指南 前言 作为容器技术的核心组件Docker守护进程 dockerd 的正常运行对整个Docker环境至关重要。本文将深入探文档教程Docker引擎守护进程日志完全指南从查看日志到高级调试Docker引擎守护进程日志完全指南从查看日志到高级调试 前言 作为容器化技术的核心组件Docker引擎守护进程 dockerd 的日志记录对于系统维护和故文档教程上一篇如何快速上手HAL模型5分钟完成RNA剪接分数预测的完整教程下一篇Go-Task 项目使用指南从基础到高级技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门