程序运行中显卡驱动掉线,重启能恢复但问题仍频出,如何解决

环境

Server: Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-76-generic x86_64)
GPU: nvidia 4090

解决思路

明确问题,排查原因

观察法
  • nvidia-smi -l记录保存到文件,回溯问题原因,温度尚可,功率也正常。排除可能的散热问题。

  • s-tui可以追踪功率变化,帮助排查电源问题(可能性通常较小,不建议优先考虑)。

实验法(可能的解决方案)
  • 增加ups设备保障供电稳定(该情况其实很少发生,但是因为实验室发生过类似问题故考虑其中)
  • 卸载重装显卡驱动:按照教程卸载干净后重装
  • 内核更新禁用:参考文章

以上方法均无法解决该问题,但过程中有发现:按照标准流程安装驱动后,运行nvidia-smi 依然会出现问题:
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
但是通过命令ll /usr/src/ 能找到已安装的驱动文件,也可通过dpkg -l | grep nvidia 确认已安装相应版本驱动。
因此在驱动安装成功的基础上,排除内核不匹配的可能原因之后,很可能是通信本身的问题(尤其是nvcc也可正常搜到,万事俱备只欠东风),通过继续检索,一篇文章的评论里提醒到我:关闭 secure boot !
尝试进入biosdisable secure boot(一般在settings 的security里面)之后,在没有重装驱动的情况下,nvidia-smi可以正常运行,故此推测是这个设定影响了主板和显卡的通信(仅瞎猜,欢迎将可靠的解释分享在评论区)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的C语言程序,用于监听RPC服务程序状态是否崩溃或掉线,并在掉线重启服务: ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { while (1) { //检测RPC服务程序是否在运行 if (system("pgrep rpc_service") != 0) { //RPC服务程序已经崩溃或掉线,执行重启操作 printf("RPC服务程序已经崩溃或掉线,开始重启...\n"); system("systemctl restart rpc_service"); } //每隔一段时间进行一次检测 sleep(60); } return 0; } ``` 该程序会在一个无限循环,每隔一段时间检测RPC服务程序是否在运行。如果检测到RPC服务程序已经崩溃或掉线,程序会输出一条提示信息,并执行重启操作。重启操作使用系统命令`systemctl restart rpc_service`来执行,你需要替换这个命令为你实际使用的命令。 请注意,这只是一个简单的例子,实际情况需要根据具体的RPC服务程序和操作系统环境进行适当的修改。同时,该程序需要在后台持续运行,可以通过nohup命令或者将程序作为系统服务来实现。 ### 回答2: 下面是一个用C语言编写的程序,用于监听RPC服务程序的状态是否崩溃或掉线,并在掉线时对其进行重启。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/wait.h> int main() { char rpcCommand[] = "<RPC服务程序命令>"; // 替换为你的RPC服务程序的命令 int restartInterval = 60; // 重启间隔时间(秒) int restartCount = 0; // 重启次数计数器 while (1) { // 检查RPC服务程序是否正在运行 FILE *fp = popen("pidof <RPC服务程序名称>", "r"); // 替换为你的RPC服务程序的名称 char pidStr[16]; fgets(pidStr, 16, fp); pclose(fp); if (strlen(pidStr) <= 1) { // RPC服务程序未运行 printf("RPC服务程序已掉线。\n"); restartCount++; if (restartCount > 3) { // 重启次数超过3次,则退出程序 printf("重启次数已达上限,程序退出。\n"); break; } // 重启RPC服务程序 printf("重启RPC服务程序...\n"); int status = system(rpcCommand); if (WIFEXITED(status) && WEXITSTATUS(status) == 0) { printf("RPC服务程序已重启。\n"); sleep(restartInterval); // 等待重启完成 } else { printf("RPC服务程序重启失败,程序退出。\n"); break; } } else { // RPC服务程序正在运行 printf("RPC服务程序正常运行。\n"); sleep(restartInterval); // 间隔一段时间再次检查 } } return 0; } ``` 使用时请将 `<RPC服务程序命令>` 替换为实际的RPC服务程序的命令,`<RPC服务程序名称>` 替换为实际的RPC服务程序的名称。程序会循环检查RPC服务程序的运行状态,如果发现掉线,则尝试重启重启次数超过3次后,程序会退出。 注意,这只是一个简单的示例程序,实际的应用场景可能需要更复杂的错误处理和日志记录机制。 ### 回答3: 要监听RPC服务程序的状态是否崩溃或掉线,并对其进行重启,可以按照以下步骤编写一个C语言程序: 1. 导入所需的头文件: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> ``` 2. 创建一个函数来检测RPC服务程序的状态: ```c int checkRPCStatus() { int status; pid_t pid = fork(); if(pid == 0) { // 执行RPC服务程序的检测指令 exit(system("rpcstatuscommand")); } else if(pid > 0) { // 等待子进程执行完毕 waitpid(pid, &status, 0); } else { printf("无法创建子进程\n"); return -1; } // 检查子进程的返回状态 if(WIFEXITED(status) && WEXITSTATUS(status) == 0) { // RPC服务程序正常运行 return 0; } else { // RPC服务程序崩溃或掉线 return -1; } } ``` 3. 创建一个函数用于重启RPC服务程序: ```c void restartRPC() { pid_t pid = fork(); if(pid == 0) { // 执行重启RPC服务程序的指令 exit(system("rpcrestartcommand")); } else if(pid < 0) { printf("无法创建子进程\n"); } // 等待子进程执行完毕 wait(NULL); } ``` 4. 在主函数循环监听RPC服务程序的状态并重启: ```c int main() { while(1) { if(checkRPCStatus() < 0) { printf("RPC服务程序崩溃或掉线,正在重启...\n"); restartRPC(); printf("RPC服务程序已成功重启。\n"); } // 每隔一段时间再次检测状态 sleep(5); } return 0; } ``` 以上是一个简单的C语言程序示例,用于监听RPC服务程序状态是否崩溃或掉线,并在掉线时对其进行重启。实际使用时,需要根据具体的RPC服务程序和重启命令进行配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值