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

news2024/12/24 8:43:06

前文:

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导致。

解决:

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

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

相关文章

linux内核网络子系统初探---概述

linux内核网络子系统初探—概述 一、网络模型 简单介绍 学习网络时&#xff0c;必定能在各种教材资料里见到以下三种网络模型&#xff1a; 三种模型间的差异&#xff1a; OSI七层模型是理论上的网络模型&#xff0c;从功能方面分成了相对独立的7个层次&#xff0c;由于太复…

如何通过 Rancher 轻松实现多云部署

“多云”通过不同的云厂商分发应用程序提高了弹性&#xff0c;能够帮助企业强化自身的竞争力。此外&#xff0c;多云还降低了被云厂商锁定的可能性&#xff0c;让企业避免过于依赖某个云厂商。 虽然多云的优势很多&#xff0c;但是管理多云 Kubernetes 的困难还是让人望而却步…

MCU自动化测量单元—峟思工程仪器仪表的智能助力

随着科技的不断发展&#xff0c;峟思工程仪器仪表在工程测量领域不断创新&#xff0c;其中MCU自动化测量单元作为一项颇具潜力的技术&#xff0c;正逐渐引起行业的广泛关注。MCU自动化测量单元作为峟思工程仪器仪表的重要组成部分&#xff0c;其应用带来了许多正面影响&#xf…

用右雅克比对旋转矩阵进行求导

考虑一个向量 a \bold{a} a对其进行旋转, 旋转用旋转矩阵 R \bold{R} R表示, 用朴素的倒数定义进行求导而不是用扰动模型, 我得到了这个过程与结果 和高博的新书结果 − R J r a ∧ -\bold{R}\bold{J}_{r}\bold{a}^{\wedge} −RJr​a∧结果不一样, 雅克比矩阵位置不同, 是不是…

神经网络结构搜索NAS

推荐课程&#xff1a;神经网络结构搜索 感谢博主ShusenWang提供的课程讲解&#xff01; 目录 1. 为什么要学习神经网络结构搜索NAS&#xff1f; 2. 什么是神经网络结构搜索NAS&#xff1f; &#xff08;1&#xff09;随机搜素Random Search 1. 为什么要学习神经网络结构搜…

位图的简单实现和使用

文章目录 1. 什么是位图2. 位图的简单实现3. 测试位图代码 1. 什么是位图 位图, 是一种非常常见的结构, 它使用每个二进制位来存放一个值的状态, 就类似于 Java 当中 HashSet 存储元素的功能. 在 Java 当中, 可以使用HashSet完成如下操作: add(T v): 添加一个元素到 HashSet…

算法:递归启蒙-汉诺塔

基本所有的讲递归的书和视频都会以汉诺塔作为开始&#xff0c;因为它足够经典 汉诺塔问题要求整个挪动的过程中都符合小压大的原则&#xff0c;就是如果同一个柱子上有超过1个的话&#xff0c;那必须下面是最大的&#xff0c;上面依次变小&#xff0c;不能出现大盘压小盘的情况…

Element Plus的Pagination 组件用法

5.2 Pagination 组件 分页组件通常与表格组件一同使用&#xff0c;在数据量很大的时候&#xff0c;通常不会在表格中一次性显示所有的数据&#xff0c;因为如果所有数据都展示在一个页面&#xff0c;数据量庞大&#xff0c;容易造成浏览器崩溃&#xff0c;就算数据可以完全展…

【CV2NLP】Chinese-Vicuna 中文小羊驼

学习一个短语&#xff01; gain proficiency in 熟练掌握 &#xff08;用我最爱的文心一言造个句子&#xff09; 最近羊驼家族百花齐放&#xff0c;赶紧学习一下 ChatBot 的背后细节。Chinese-Vicuna 中文小羊驼是基于 Vicuna 模型使用中文数据 LORA 方案来微调的一种中文对…

数值分析-牛顿-柯特斯公式的概念、推导与应用

目录 一、引言 二、牛顿-柯特斯公式的基本概念 三、牛顿-柯特斯公式的推导 四、牛顿-柯特斯公式的应用 五、牛顿-柯特斯公式的优缺点 六、总结 一、引言 数值分析是数学中的一个重要分支&#xff0c;它研究如何利用数值方法来解决实际问题。在数值分析中&#xff0c;牛顿…

Redux 学习系列(一) —— 基础概念入门篇

简介 Redux 是一个可预测的 JavaScript 应用状态管理容器&#xff0c;也可以说是一个应用数据流框架。 作用 Redux 主要是用作应用状态的管理。它抽离所有组件的状态&#xff0c;构造一个中心化的单独常量状态树&#xff08;对象&#xff09;来保存这一整个应用的状态。这棵…

Java经典笔试题—day02

Java经典笔试题—day02 &#x1f50e;选择题&#x1f50e;编程题&#x1f95d;排序子序列&#x1f95d;倒置字符串 &#x1f50e;结尾 &#x1f50e;选择题 (1)A 派生出子类 B &#xff0c; B 派生出子类 C &#xff0c;并且在 java 源代码有如下声明&#xff1a; A a0new A(…

HTTPS协议介绍

文章目录 一、HTTPS协议的认识二、常见的加密方式1.对称加密2.非对称加密 三、数据摘要四、HTTPS的工作过程探究1.只使用对称加密2.只使用非对称加密3.双方都使用非对称加密4.非对称加密对称加密5.中间人攻击6.引入证书7.非对称加密对称加密证书认证 一、HTTPS协议的认识 HTTP…

【数据库】面试高频问题汇总及详细解答

【C语言部分】面试高频问题汇总及详细解答 【操作系统(Linux)】面试高频问题汇总及详细解答 【计算机网络】面试高频问题汇总及详细解答 本文目录 1. SQL1.1 介绍一下数据库分页1.2 介绍一下SQL中的聚合函数1.3 表跟表是怎么关联的1.4 说一说你对外连接的了解1.5 说说SQL中怎么…

VM虚拟机安装Ubuntu server 22.04网络问题

在使用vm虚拟机安装ubuntu server 22.04的时候会遇到一些网络问题&#xff0c;例如虚拟机内的Ubuntu不能上网&#xff0c;ping www.baidu.com不通&#xff0c;主机使用远程工具不能建立远程连接&#xff0c;Ubuntu ping本地主机不通&#xff0c;本地主机ping虚拟机也不通的问题…

vue3+vite项目优化。

最近开发的一个vue3vitets项目&#xff0c;build后发现体积过大&#xff0c;所以针对于项目体积进行一次优化。 一: 使用rollup-plugin-visualizer 可视化分析包 npm i rollup-plugin-visualizer -S 在vite.config.js中引入 在 plugins里面 然后执行npm run build就自动打开…

最新开源Chatgpt人工智能对话源码系统如何搭建?含详细安装教程分享和源码

人工智能对话系统市场需求正在不断增长。随着人们对智能化、自动化服务的需求不断提高&#xff0c;人工智能对话系统成为越来越多企业和组织的首选解决方案&#xff0c;可以有效提升用户体验、降低成本、提高效率。 一、Chatgpt人工智能对话源码系统定义 ChatGPT是一种基于深…

流量挂机赚钱项目Traffmonetizer

利用闲置电脑/服务器/安卓手机/树莓派来赚点电费 简介 Traffmonetizer是一个来自欧洲的流量挂机平台&#xff0c;类似Peer2profit&#xff0c;满10刀可提现(Paypal、BTC、Payoneer)&#xff0c;注册好像就送5刀&#xff0c;Traffmonetizer不怎么占用CPU和内存以及流量&#x…

初学容器化

1.docker build&#xff0c;ship&#xff0c;run&#xff0c;any app anywhere docker类似运输中的集装箱&#xff0c;可以装任何应用&#xff08;镜像文件&#xff09;&#xff0c;运行到各种服务器上。 docker提供的是进程上的隔离&#xff0c;虚拟机提供的是操作系统资源…

【五一创作】嵌入式Sqlite数据库【基本语法、Sqlite-JDBC、嵌入到Java程序】

目录 前言 基本介绍 Sqlite 对比 MySQL 字段类型 语法 创建表 插入数据 更新数据 查询数据 删除数据 查看建表语句 Sqlite-JDBC 嵌入到Java程序 前言 最近在用JavaFX做一个桌面软件需要用到数据库&#xff0c;但MySQL这种数据库明显只能本地访问&#xff0c;把软…