FT2000+ qemu kvm 64C64G 通过频繁设置CPU online 状态导致虚拟机openEuler 操作系统假死测试用例2

前文:

https://hknaruto.blog.csdn.net/article/details/130408240

测试程序

/**
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[]) {

  int period = 100000;
  int quota = CPU_CORE_COUNT * 0.8 * 100000;
  cout << "period is " << period << endl;
  cout << "quota is " << quota << endl;
  srand(time(nullptr));

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

  set_period(period);
  set_quota(quota);

  while (true) {
    sleep(10000);
  }

  return 0;
}

编译

 g++ -DCPU_CORE_COUNT=64 -lpthread -std=c++11 trigger_cgroup_timer_inactive.cpp -o tcti

FT2000+ kvm openEuler 22.03 LTS 64C64G(正常)

经历9次手动重启tcti进程,第10次持续运行一个晚上,未发生进程或者os卡死现象

距离开机65376秒,仍然正常(开机即开始测试)

 说明此调度故障已在openEuer 22.03 LTS版本内核修复,内核版本如下

5.10.0-60.18.0.50.oe2203.aarch64

验证方案一:openEuler 20.03 LTS SP3 升级到22.03 LTS版本内核

直接从openEuler-22.03-LTS-everything-aarch64-dvd.iso:/Packages/kernel-source-5.10.0-60.18.0.50.oe2203.aarch64.rpm获取

scp方式拷贝rpm包20.03 kvm虚拟机

rpm安装

 

 所有需要选择的地方,直接回车

make modules_install
make install

reboot

采用5.10.0版本内核启动

执行测试

9次手动重启,第10次知道故障发生

 持续半小时,正常。

基本可以判断openEuler 5.10.0内核已修复此问题。

故障处理

flex: command not found biosn: comman not found

yum install -y bison flex

 cannot resolve BTF IDs for CONFIG_DEBUG_INFO_BTF, please install libelf-dev, libelf-devel or elfutils-libelf-devel

yum install -y elfutils-libelf-devel

openssl/opensslv.h: no such file or directory

yum install -y openssl-devel

bc: command not found

yum install -y bc

Failed to generate BTF for vmlinux

vim .config

主持掉以下这行,保存重新编译 

 询问 DEBUG_INFO_BTF,输入n

 no space left on device

 删掉无用的文件,或者扩容虚拟盘

qemu-img resize gpt分区 parted修复分区信息 虚拟机 lvm 扩容根分区_hkNaruto的博客-CSDN博客

验证方案二:openEuler 20.03 LTS SP3 升级到官网linux-5.10.38.tar.xz

刚好本地有这个版本,都是5.10的大版本号

cd linux-5.10.38
cp /usr/src/linux-5.10.0-60.18.0.50.oe2203.aarch64/.config .
make -j64
make modules_install
make install

选择5.10.38版本启动

执行测试

约1小时后,故障发生,进程没有输出,也不能退出...

 qemu-kvm进程CPU消耗也掉到0%

 问题复现,说明openEuler版本内核有特别的处理。

 

故障

 启动失败(Guest disabled display.)

make defconfig导致。

解决:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【刷题】141. 环形链表

141. 环形链表 一、题目描述二、示例三、实现思考总结 141. 环形链表 一、题目描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环…

Spring是什么?关于Spring家族

初识Spring 什么是Spring&#xff1f; Spring是一个开源的Java企业级应用程序开发框架&#xff0c;由Rod Johnson于2003年创建&#xff0c;并在接下来的几年里得到了广泛的发展和应用。它提供了一系列面向对象的编程和配置模型&#xff0c;支持开发各种类型的应用程序&#x…

晒出新高度?2023夏季小红书防晒趋势前瞻

夏日将临&#xff0c;防晒需求激增&#xff0c;进入市场旺季。今年防晒赛道朝着“防护升级&#xff0c;多面兼顾”大势发展。 哪些趋势值得关注&#xff1f;本期&#xff0c;千瓜将通过小红书数据分析和笔记内容洞察&#xff0c;为品牌提供数据支持和方向参考。 月增长高达501.…

QProgressBar详解

QProgressBar详解 [1] QProgressBar详解1.QProgressBar简述2.常用方法3.示例&#xff0c;比较进度条4.设置样式表 [1] QProgressBar详解 原文链接&#xff1a;https://blog.csdn.net/wzz953200463/article/details/125530997 1.QProgressBar简述 QProgressBar提供了一个水平…

分布式锁Redisson对于(不可重入、不可重试、超时释放、主从一致性)四个问题的应对

文章目录 1 Redisson介绍2 Redisson快速入门3 Redisson可重入锁原理4 Redisson锁重试和WatchDog机制5 Redisson锁的MutiLock原理 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff…

创维高安版-E900-Hi3798MV100-强刷卡刷固件包-当贝纯净桌面

创维高安版-E900-Hi3798MV100-强刷卡刷固件包-当贝纯净桌面-内有主板图短接点和教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置…

架构师日记-深入理解软件设计模式 | 京东云技术团队

作者&#xff1a;京东零售 刘慧卿 一 设计模式与编程语言 1.1 什么是设计模式 设计模式&#xff08;Design pattern&#xff09; &#xff1a;由软件开发人员在软件开发中面临常见问题的解决方案&#xff0c;是经过长时间的试验积累总结出来的&#xff0c;它使设计更加灵活和…

Ubuntu 安装 Mysql

主要内容 本文主要是实现在虚拟机 Ubuntu 18.04 成功安装 MySQL 5.7&#xff0c;并实现远程访问功能&#xff0c;以 windows 下客户端访问虚拟机上的 mysql 数据库。 1. 切换至 root 用户 &#xff0c;shell 终端指令均执行在 root 用户下 sudo su 2. 安装并设置 mysql 安…

通用操作日志处理方案

why&#xff08;目的理念&#xff09;&#xff1a;操作日志是什么需要做哪些事情&#xff1f; 摘自美团博客的操作日志的介绍 操作日志的记录格式大概分为下面几种&#xff1a; * 单纯的文字记录&#xff0c;比如&#xff1a;2021-09-16 10:00 订单创建。 * 简单的动态的文本…

springboot+dubbo+zookeeper 项目实战

现在有一段代码再前台&#xff0c;后台系统中都存在&#xff0c;都需要这段代码&#xff0c;存在这种情况&#xff0c;我们可以选择将这段代码提取出来作为一个服务&#xff0c;让前台和后台系统作为消费者远程调用这段代码&#xff0c;提高了代码的复用性。 springboot集成dub…

【软考备战·希赛网每日一练】2023年5月4日

文章目录 一、今日成绩二、错题总结第一题第二题第三题第四题三、知识查缺 题目及解析来源&#xff1a;2023年05月04日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 修改Linux文件权限命令&#xff1a;chmod。 第二题 解析&#xff1a; 第三题 解析…

坚持伙伴优先,共创数据存储新生态

4 月 26 日&#xff0c;2023 阿里云合作伙伴大会上&#xff0c;阿里巴巴集团董事会主席兼 CEO、阿里云智能集团 CEO 张勇表示&#xff0c;阿里云的核心定位是一家云计算产品公司&#xff0c;生态是阿里云的根基。让被集成说到做到的核心&#xff0c;是要坚定走向“产品被集成”…

【OpenSSH】无需公网IP使用SSH远程连接服务器

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转…

Winform从入门到精通(36)——ColorDialog(史上最全)

文章目录 前言一、属性1、AllowFullOpen2、AnyColor3、Color4、FullOpen5、ShowHelp6、SolidColorOnly7、Tag二、事件1、HelpRequest前言 当我们需要设置某个控件的颜色时,并且需要弹出一个可以选择颜色的对话框时,这时候就需要使用ColorDialog 一、属性 1、AllowFullOpen…

Java设计模式-建造者模式

简介 建造者模式是一种创建型设计模式&#xff0c;用于将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。建造者模式通过将复杂对象的构建过程分解为多个简单的步骤来实现。 与其他创建型模式不同&#xff0c;建造者模式强调的是将构建过…

BadUsb使用

1 IDE下载 地址&#xff1a;Software | Arduino 2 开发版驱动安装 linux和mac版本会自动识别提示你安装开发板&#xff0c;驱动貌似不需要额外安装 win需要根据板子型号去下载安装驱动 如 Arduino驱动的安装教程-DFRobot产品资料库 默认会提示你根据你插入的设备进行提示…

Shell+VCS学习3---VCS-lint

lint lintTFIPC-L LINTPCWMlintTFIPC-L(如果有的模块的端口定义了&#xff0c;但是没有连接&#xff0c;用这个选项&#xff0c;编译器会给出哪些端口没有连接) 其中CAWM貌似直接写成lintCAWM&#xff0c;vcs是不认的&#xff0c;得写成lintCAWM-L 不过CAWM的检查规则有点奇怪…

maven从入门到精通 第三章 Maven中形成web对Java工程的依赖

这里写自定义目录标题 一 war永远依赖于jar1. 在web工程的项目2中,加入项目1的路径依赖2 在web工程中&#xff0c;加入测试代码2.1 创建目录2.2 确认依赖junit2.3创建测试类2.4 运行测试2.5 打包2.6 查看依赖列表2.7 树形结构查看 二 测试依赖的范围1 compile的编译过程1.1 com…

快速排序算法

文章目录 一、前言二、快速排序算法的基本思想三、快速排序算法流程四、实现快速排序算法的Java代码五、分析代码实现过程1.partition方法2.quickSort方法3.swap方法4.main方法5.整体串讲 六、对快速排序算法的时间复杂度和稳定性进行讨论七、对快速排序算法的空间复杂度分析比…

USB2.0(一):基础

一、总线标准 USB1.1&#xff1a;支持12Mbps全速率&#xff08;FullSpeed&#xff09;和1.5Mbps低速率&#xff08; HalfSpeed&#xff09;USB2.0&#xff1a;支持480Mbps高速率&#xff08;High Speed&#xff09;&#xff0c;兼容1.1USB3.0&#xff1a;支持5Gbps超高速率&am…