FT2000+ qemu kvm 红旗 crash 分析 频繁设置CPU online导致进程卡死、不调度故障

news2024/10/5 13:47:17

测试程序

/**
tcti.cpp

参考:
https://www.cnblogs.com/organic/p/17321523.html

g++ -std=c++11 -lpthread trigger_cgroup_timer_inactive.cpp -o inactive_timer
./inactive_timer 100000 10000
*/

#include <errno.h>
#include <iostream>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

#ifndef CPU_CORE_COUNT
#define CPU_CORE_COUNT 64
#endif

using namespace std;
std::string sub_cgroup_dir("/sys/fs/cgroup/cpu/test");

// common lib
bool is_dir(const std::string &path) {
  struct stat statbuf;
  if (stat(path.c_str(), &statbuf) == 0) {
    if (0 != S_ISDIR(statbuf.st_mode)) {
      return true;
    }
  }
  return false;
}

bool write_file(const std::string &file_path, int num) {
  // std::cout << file_path << " op:" << num << std::endl;
  FILE *fp = fopen(file_path.c_str(), "w");
  if (fp == NULL) {
    return false;
  }

  // std::cout << file_path << " op:" << num << std::endl;
  std::string write_data = to_string(num);
  fputs(write_data.c_str(), fp);
  fclose(fp);
  return true;
}

std::string read_file(const std::string &file_path) {
  FILE *fp = fopen(file_path.c_str(), "r");
  if (NULL == fp) {
    return "read error...\n";
  }
  char buff[512];
  memset(buff, 0, 512);
  fread(buff, 512, 1, fp);
  fclose(fp);
  return std::string(buff);
}

// ms
long get_ms_timestamp() {
  timeval tv;
  gettimeofday(&tv, NULL);
  return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
}

// cgroup
bool create_cgroup() {
  if (is_dir(sub_cgroup_dir) == false) {
    if (mkdir(sub_cgroup_dir.c_str(), S_IRWXU | S_IRGRP) != 0) {
      cout << "mkdir cgroup dir fail" << endl;
      return false;
    }
  }

  int pid = getpid();
  cout << "pid is " << pid << endl;
  std::string procs_path = sub_cgroup_dir + "/cgroup.procs";
  return write_file(procs_path, pid);
}

bool set_period(int period) {
  std::string period_path = sub_cgroup_dir + "/cpu.cfs_period_us";
  return write_file(period_path, period);
}

bool set_quota(int quota) {
  std::string quota_path = sub_cgroup_dir + "/cpu.cfs_quota_us";
  return write_file(quota_path, quota);
}

bool set_cpuOnline(int cpuId, int online) {
  std::string cpuPath = std::string("/sys/devices/system/cpu/cpu") +
                        std::to_string(cpuId) + std::string("/online");
  return write_file(cpuPath, online);
}

// thread
// param: ms interval
void *thread_func(void *param) {
  int i = 0;
  int interval = (long)param;
  long last = get_ms_timestamp();

  while (true) {
    i++;
    if (i % 100000 != 0) {
      continue;
    }

    long current = get_ms_timestamp();
    if ((current - last) >= interval) {
      last = current;
    }
  }

  pthread_exit(NULL);
}

void test_thread() {
  const int k_thread_num = CPU_CORE_COUNT * 10;
  pthread_t pthreads[k_thread_num];

  for (int i = 0; i < k_thread_num; i++) {
    if (pthread_create(&pthreads[i], NULL, thread_func, (void *)(i + 1)) != 0) {
      cout << "create thread fail" << endl;
    } else {
      cout << "create thread success,tid is " << pthreads[i] << endl;
    }
  }
}

void *thread_cpu_online_ctl(void *param) {
  int online, cpu;
  bool b;
  while (true) {
    online = rand() % 2;
    cpu = rand() % CPU_CORE_COUNT;
    b = set_cpuOnline(cpu, online);
    std::cout << cpu << " -> " << online << "result:" << b << std::endl;
    std::cout << read_file("/sys/devices/system/cpu/online") << std::endl;
  }

  pthread_exit(NULL);
}

void cpu_ctl_thread() {
  const int k_thread_num = CPU_CORE_COUNT;
  pthread_t pthreads[k_thread_num];

  for (int i = 0; i < k_thread_num; i++) {
    if (pthread_create(&pthreads[i], NULL, thread_cpu_online_ctl,
                       (void *)(i + 1)) != 0) {
      cout << "create thread fail" << endl;
    } else {
      cout << "create thread success,tid is " << pthreads[i] << endl;
    }
  }
}

int main(int argc, char *argv[]) {

  srand(time(nullptr));

  test_thread();
  cpu_ctl_thread();
  if (create_cgroup() == false) {
    cout << "create cgroup fail" << endl;
    return -1;
  } 

  while (true) {
    sleep(10000);
  }

  return 0;
}

补充:经后续测试发现,与设置cpu.cfs_period_us、cpu.cfs_quota_us无关。

故障现象

64C64G运行一个多小时后,进程不再输出,无法停止(如果此时重启,系统会卡在重启过程)

crash 分析

virsh dump

 virsh reset

 vnc登录,crash

 分析

ps | grep tcti |less

 所有测试程序均标记为运行状态。实际上并没有CPU使用了了。

set pid ; runq -c cpuid

 查看pid=2743进程状态为运行中,CPU号=2

runq查看CPU号=2的运行队列,显示no tasks queued

即:进程被标记在CPU2上正在运行,而CPU2上显示没有任何任务队列。

查看task对应的se没有在rq上,cfs_rq显示被throttled

 runq -c 2 -g

 由于CONFIG_RT_GROUP_SCHED未配置,因此无法查看task_group.rt_bandwith

 参考以下文章

https://www.cnblogs.com/organic/p/17321523.html

根据其分析,当故障发生时,手动设置下cgroup限制即可触发定时器恢复调用

复测验证

复现进程假死

 所有线程CPU均无使用率(ssh远程登录上去)

 手动修改下cgroup配置

 发现指令被卡主

说明本文的现象与

https://www.cnblogs.com/organic/p/17321523.html

所描述有差异。(同时也不可继续操作cpu online状态)

本文中测试程序添加了cpu online状态设置,原目的是尝试触发_nohz_idle_balance,分析以前发生的类似故障。

目前已知情况

OS内核故障
CentOS8.3.20114.18.0-240.el8.aarch64容易复现
RedFlag74.19.133-300.axs7.14.aarch64容易复现
openEuler 20.03 LTS SP34.19.90-2112.8.0.0131.oe1.aarch64可复现
openEuler 22.03 LTS5.10.0-60.18.0.50.oe2203.aarch64未复现

从上述表格可以推测,该调度问题,在openEuler 22.03 LTS版本内核已经修复过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis进阶(集群,雪崩,击穿,穿透.......)

Redis进阶 Redis事务_事务的概念与ACID特性 Redis的事物不保证原子性 数据库层面事务 在数据库层面&#xff0c;事务是指一组操作&#xff0c;这些操作要么全都被成功执行&#xff0c;要么全都不执行。 数据库事务的四大特性 A&#xff1a;Atomic&#xff0c;原子性&#xf…

Docker笔记5 | 容器的基本操作

5 | 容器的基本操作 1 启动容器1.1 启动方式1.2 新建容器并启动1.3 docker run时的运行过程1.4 启动已终止容器1.5 后台运行1.6 查看容器信息 2 终止容器3 进入容器3.1 docker attach3.2 docker exec 4 导入导出容器4.1 导出容器4.2 导入容器 5 删除容器 1 启动容器 1.1 启动方…

Linux内核主要组成部分有哪些?

Linux 内核由几大子系统构成&#xff0c;分别为进程调度、进程间通信&#xff08;IPC&#xff09; 、内存管理、虚拟 文件系统和网络接口。这几大子系统既相互独立又有非常紧密的关联。图 3-5 展示了内核的 几大子系统之间以及这些子系统和计算机系统的其他模块之间的关系。 接…

ADS-B教学实验方案

ADS-B教学系统是为了让学生学习ADS-B原理、ADS-B系统组成、ADS-B信号处理技术。可以通过ADS-B教学系统进一步研究分析ADS-B位置的精度、准确性、稳定性、实时性&#xff0c;设计基于ADS-B的空中碰撞告警系统&#xff0c;混合空域的空中交通管理系统(UTM)设计。也可以研究ADS-B报…

《花雕学AI》你不知道的AI 机器人:29个让你大开眼界的事实

AI 机器人是人工智能技术的最具代表性的应用之一&#xff0c;它们可以模仿人类的行为和思维&#xff0c;完成各种复杂的任务&#xff0c;如识别图像、语音和文字&#xff0c;进行对话、翻译和推理&#xff0c;控制机械臂、汽车和飞机等。AI 机器人的发展速度令人惊叹&#xff0…

Windows命令提示行使用指南二(批处理)

命令提示行使用指南 前言四、批处理简介五、如何编写批处理1、Hello world2、做加法3、查找文件&#xff0c;并输出到文本。4、批量重命名5、自动记录开机时间 前言 cmd 是 Windows 操作系统中的命令行界面&#xff08;CLI&#xff09;&#xff0c;也称为命令提示符&#xff0…

Linux shell编程 数组排序算法

冒泡排序 循环对比相邻的元素&#xff0c;交换较大元素到后面的位置 大循环根据列表中存在的元素数量循环n-1次&#xff0c;保证所有元素都能被排序完成 小循环从前向后遍历&#xff0c;循环一次循环范围减少一位&#xff08;由于后面的已经排列完成无需再比较&#xff09;小循…

【halcon知识】应用仿射变换

一、说明 无论什么样的变换&#xff0c;都离不开齐次变换矩阵。一般地&#xff0c;先准备一个空的齐次变换矩阵&#xff0c;这个矩阵随便填写&#xff1a;1&#xff09;填入旋转类参数就是旋转矩阵&#xff0c;2——填入仿射参数就可进行仿射变换&#xff0c;3&#xff09;填入…

Kali-linux攻击WordPress和其他应用程序

今天越来越多的企业利用SAAS&#xff08;Software as a Service&#xff09;工具应用在他们的业务中。例如&#xff0c;他们经常使用WordPress作为他们网站的内容管理系统&#xff0c;或者在局域网中使用Drupal框架。从这些应用程序中找到漏洞&#xff0c;是非常有价值的。 为…

[JAVA数据结构]堆

目录 1.堆的概念 2.堆的创建 3.堆的插入与删除 3.1堆的插入 3.2堆的删除 1.堆的概念 如果有一个关键码的集合K {k0&#xff0c;k1&#xff0c; k2&#xff0c;…&#xff0c;kn-1}&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;…

【Linux】远程桌面连接服务器报错:未启用对服务器的远程访问......

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 前述操作环境说明&#xff1a;远程报…

<数据结构>NO4.带头双向循环链表

文章目录 前言1. 头文件2. 函数实现1&#xff09;创建哨兵位节点2&#xff09;新增一个节点3&#xff09;打印链表4&#xff09;头插5&#xff09;尾插6&#xff09;头删7&#xff09;尾删8&#xff09;查找9&#xff09;pos前插入10&#xff09;删除pos处节点11&#xff09;销…

Redis 缓存穿透、缓存击穿与缓存雪崩

文章目录 1. 缓存穿透解决方法 2. 缓存击穿解决方法 3. 缓存雪崩解决方法 在 redis 的应用场景中&#xff0c;需要考虑缓存在某些场景下可能出现的问题&#xff1a; 缓存穿透 缓存击穿 缓存雪崩 以下缓存问题的讨论都是基于以下应用架构讨论的&#xff1a; 1. 缓存穿透 对应…

数据备份系列:Rsync 备份实战记录(二)

一、Rsync Cron 场景使用 在对数据备份要求实时性不高的情况下&#xff0c;可优先考虑该场景&#xff0c;选择一个合适的时间&#xff0c;对数据进行定时远程增量同步。 在《数据备份系列&#xff1a;Rsync 备份详解&#xff08;一&#xff09;》中我们已经对服务搭建以及远程…

DAD-DAS模型

DAD-DAS模型 文章目录 DAD-DAS模型[toc]1 产品服务:需求方程2 实际利率:费雪方程3 通货膨胀:菲利普斯方程4 预期通货膨胀&#xff1a;适应性预期5 货币政策规则&#xff1a;泰勒方程6 动态总供给-总需求方程&#xff08;DAS-DAD&#xff09;7 总供给冲击模拟 1 产品服务:需求方…

【JavaEE初阶】文件操作——IO

摄影分享~ 文章目录 文件文件路径&#xff08;Path&#xff09; 文件的类型Java中操作文件File概述 文件内容的读写——数据流字节流InputStream概述OutputStream 概述字符流FileInputStream 概述利用 Scanner 进行字符读取 实例练习 文件 文件&#xff1a;File这个概念&…

PostSQL内存管理之内存上下文

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;14 文档用途 了解pg内存分配 详细信息 1.MemoryContex机制 内存上下文是pg相关的内存控制结构&#xff0c;树形结构组织下的内存上下文能在频繁的…

SNMPc软件的下载和安装教程,计算机网络管理,网络工程师

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

vue 改变数据后,数据变化页面不刷新

文章目录 导文文章重点方法一&#xff1a;使用this.$forceUpdate()强制刷新方法二&#xff1a;Vue.set(object, key, value)方法三&#xff1a;this.$nextTick方法四&#xff1a;$set方法 导文 在vue项目中&#xff0c;会遇到修改完数据&#xff0c;但是视图却没有更新的情况 v…

让开发者成为创新主体 | 阿里云云原生4月动态

作者&#xff1a;云原生内容小组 云原生月度动态 ✦ 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 本栏目每月更新。 01 趋势热点 &…