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

news2024/11/27 16:46:13

宿主机配置

 

 

虚拟机配置文件

<domain type='kvm'>  //如果是Xen,则type=‘xen’
  
    
    <name>redflag1</name> //虚拟机名称,同一物理机唯一
  
    
    <uuid>44748c15-7c00-4817-8724-675a27c3f821</uuid>  //同一物理机唯一,可用uuidgen生成
  
    
    <memory>67108864</memory>
    <currentMemory>67108864</currentMemory>  //memory这两个值最好设成一样
  
    
    <vcpu>64</vcpu>
    <cpu mode="host-passthrough"/>
    <os>
        <type arch='aarch64' machine='virt'>hvm</type>
        <loader readonly='yes' type='pflash'>/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw</loader>
        <nvram template='/usr/share/edk2/aarch64/vars-template-pflash.raw'>/usr/share/edk2/aarch64/QEMU_VARS.fd</nvram>
    </os>
    <features>
        <acpi/>
        <apic/>
        <pae/>
    </features>
    <clock offset='localtime'/>  //虚拟机时钟设置,这里表示本地本机时间
  
    
    <on_poweroff>destroy</on_poweroff>  //突发事件动作
  
    
    <on_reboot>restart</on_reboot>
    <on_crash>restart</on_crash>
    <devices>   //设备配置
        
        <emulator>/usr/bin/qemu-kvm</emulator> //如果是Xen则是/usr/lib/xen/binqemu-dm            

        <controller type="scsi" index="0" model="virtio-scsi"/>
        <controller type='usb' index='0' model='qemu-xhci' ports='15'/>
        <input type='keyboard' bus='usb'/>
        <input type='mouse' bus='usb'/>
        <input type='tablet' bus='usb'/>
        <disk type='file' device='cdrom'>//光盘
      
            
            <driver name='qemu' type='raw'/>
            <source file='/home/yeqiang/RedFlag-Asianux-Server-7.5-aarch64-for-Phytium-dvddisc-20210701.iso'/>
            <target dev='hda' bus='scsi'/>
            <readonly/>
        </disk>

        <disk type='file' device='disk'> //硬盘      
            
            <driver name='qemu' type='qcow2'/>
            <source file='/home/yeqiang/qemu-virtual-machine/redflag.qcow2'/>
            <target dev='vda' bus='virtio'/>
        </disk>
                <graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0' keymap='en-us'>  //配置vnc,windows下可以使用vncviewer登录,获取vnc端口号:virsh vncdisplay vm0
     
            
            <listen type='address' address='0.0.0.0'/>
        </graphics>
        <interface type='bridge'>
          <source bridge='virbr0'/>
        </interface>

    </devices>
</domain>

测试程序

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

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;
}

// 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 = 320;
  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() % 64;
    b = set_cpuOnline(cpu, online);
    // std::cout << cpu << " -> " << online << "result:" << b << std::endl;
  }

  pthread_exit(NULL);
}

void cpu_ctl_thread() {
  const int k_thread_num = 64;
  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 = 4000000;
  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++ -std=c++11 -lpthread tcti.cpp -o tcti

执行

./tcti &

vmstat监控

vmstat 1

一段时间后

此时,bash上敲击回车能换行,但是无信息输出

ctrl+C 可退出程序(又一次测试未退出,卡主了)

tcti进程 cpu 0%

kill -9 无法杀死

reboot,卡死

此时键盘输入有信息打印

卡死后,放置约14小时后,再次vnc登录,光标已不再闪烁,键盘输入也没有给出反馈,彻底死机。

此时在宿主机查看kvm进程CPU状态,几乎没有消耗

 

virsh 导出内核转储文件分析(64G内存,时间较长)

virsh dump --memory-only --format=kdump-zlib  redflag1 redflag1-coredump-0428-stucked.zlib

重启虚拟机,分析coredump

crash调试

 

 

bt -a

 ps

 

原本期望通过不断设置CPU在线状态,迫使CFS触发_nohz_idle_balance。实际上的故障与期望不一致,产生了新问题。

重新测试

刚开始测试时,100.0 id 数值明显不对,应该是操作CPU在线状态导致

约6分钟后,测试进程没有CPU消耗了

 

 STAT:SI 

S      //处于休眠状态;

l      //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads); 

参考:Linux进程状态(ps stat)详解_smartvxworks的博客-CSDN博客

说明此时线程sleep后没有再被调度器分配CPU了 。

当前CPU online状态

gdb attach上去看看

挂不上去,且无法退出

正确指令应该是 gdb attach 2034(虽然敲错了指令,但日志已显示Attatching to process 2034)

在kvm外,导出coredump

virsh dump --memory-only --format=kdump-zlib  redflag1 redflag1-coredump-0428-stucked2.zlib

 

 

 

 从目前看,应该是触发了bug,当前任务被调度出去,一直没能调度回来。该进程程序本身没有什么问题。

查看几个子线程,连号

 都在这个位置

复测,待续。。。 

10分51秒后,tcti CPU占用率掉到了0%

尝试手动调整cgroup限制,新开ssh窗口登录上去,方便观察top信息

cat /dev/null > /sys/fs/cgroup/cpu/test/cgroup.procs 
cat /dev/null > /sys/fs/cgroup/cpu/test/tasks 

查看发现无法清空

 设置所有CPU online=1

 ls /sys/devices/system/cpu/ | grep cpu | grep -v freq | grep -v idle | xargs -i echo "echo 1 > /sys/devices/system/cpu/"{}"/online" | bash

当前进程卡死了。。。

推测引发了内核层bug

mesg当前时段没有信息输出

 openEuler复测

openEuler 20.03 LTS SP3 aarch64 

运行两小时,正常,说明是内核的bug

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

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

相关文章

北京 Meetup 预告 | 内含六个话题,满满干货,期待见面!

在春之末尾&#xff0c;夏之开始的5月&#xff0c;响应社区小伙伴们的呼唤&#xff0c;我们泽拓科技将在北京举办线下社区技术交流活动。 此次我们泽拓科技邀请了去哪儿网、ScaleFlux、美团、SphereEx的相关资深专家来分享他们的数据库探索与实践。我们真诚邀请数据库技术社区…

Day3_Springboot框架搭建

前面两天介绍了vue前端的主体框架&#xff0c;并完成了相关页面的部分设置&#xff0c;接下来开始介绍springboot后端开发的过程&#xff0c;手把手实践。包括项目的初始构建以及集成mybatis、mybatis-plus实现增删改查&#xff0c;分页查询&#xff0c;集成swagger-ui测试&…

Spring(4) Spring是如何使用三级缓存来解决循环依赖问题?

目录 1.什么是循环依赖&#xff1f;2.什么是Spring的循环依赖&#xff1f;3.三级缓存解决循环依赖3.1 假如只使用一级缓存3.2 假如使用二级缓存3.3 为什么要使用三级缓存 4.三级缓存解决循环依赖的局限性 1.什么是循环依赖&#xff1f; 假设我们有两个类 A 和 B&#xff0c;类…

【Docker】1、认识 Docker 和安装 Docker

目录 零、项目部署问题一、Docker 简介二、Docker 和虚拟机三、镜像和容器四、Docker 架构五、CentOS7 上安装 Docker(1) 卸载曾经安装过的 Docker(2) 安装 Docker(3) 启动 Docker(4) 启动、关闭、重启 Docker 六、配置 Docker 镜像国内仓库 零、项目部署问题 大型项目组件较多…

爬虫(requsets)笔记

1、request_基本使用 pip install requests -i https://pypi.douban.com/simple 一个类型六个属性 r.text 获取网站源码 r.encoding 访问或定制编码方式r.url 获取请求的urlr.content 响应的字节类型r.status_code 响应的状态码r.headers 响应的头信息 import requestsurl…

VS2022汇编环境搭建

VS2022汇编环境搭建 使用VS2022搭建汇编语言运行环境Step 1 安装VS2022Step 2 创建项目 使用VS2022搭建汇编语言运行环境 使用Visual Studio 2022 搭建汇编语言项目&#xff0c;运行汇编语言代码。 Step 1 安装VS2022 自行到官网下载安装&#xff0c;选择C编程环境。 Step…

【RabbitMQ】| Lion带你 (超详细) 从0到1使用SpringBoot操作RabbitMQ

目录 一. &#x1f981; 前言二. &#x1f981; SpringBoot操作RabbitMQⅠ. 前期准备工作1. 创建项目&#xff08;不细说&#xff09;2. 添加依赖3. 编写配置文件 Ⅱ. 创建队列和交换机Ⅲ. 创建生产者Ⅳ. 创建消费者 三. &#x1f981; 总结 一. &#x1f981; 前言 Spring Bo…

Spring MVC开发及使用(8000字详解)

如何学习 Spring MVC&#xff1f; 学习 SPring MVC 只需要掌握以下三个功能&#xff1a; 连接的功能&#xff1a;将用户&#xff08;浏览器&#xff09;和 Java 程序连接起来&#xff0c;也就是访问一个地址能够调用到我们 Spring程序&#xff1b;获取参数的功能&#xff1a;用…

颜色空间转换RGB-YCbCr

颜色空间 RGB、YUV和YCbCr都是人为规定的彩色模型或颜色空间&#xff08;有时也叫彩色系统或彩色空间&#xff09;。它的用途是在某些标准下用通常可接受的方式对彩色加以说明。本质上&#xff0c;彩色模型是坐标系统和子空间的阐述。 YCbCr与RGB的相互转换 RGB->YCbCr Y …

2023五一杯数学建模竞赛ABC题思路解析+代码+论文

AB题见文末&#xff0c;下面是C C题&#xff1a;“双碳”目标下低碳建筑研究 “双碳”即碳达峰与碳中和的简称&#xff0c;我国力争2030年前实现碳达峰&#xff0c;2060年前实现碳中和。“双碳”战略倡导绿色、环保、低碳的生活方式。我国加快降低碳排放步伐&#xff0c;大力推…

金陵科技学院五年一贯制专转本电路分析考试大纲

金陵科技学院五年一贯制专转本电路分析考试大纲 专业名称&#xff1a;自动化 考试科目&#xff1a;专业基础课 一、考试要求 掌握电路分析的基本概念、基本原理和基本方法&#xff0c;提高分析电路的思维能力与计算能力&#xff0c;以便为学习后继课程奠定必要的基础。 二…

R 安装函数包及绘制图形

R语言绘制简单条形图 一、载入数据1.安装函数包2.导入文件3.读取数据&#xff08;.csv文件&#xff09; 二、绘制图形绘制简单条形图 一、载入数据 1.安装函数包 在控制台console输入命令&#xff1a; install.packages("bruceR")查看是否安装成功 library(bruce…

【二】MATLAB矩阵处理

【二】MATLAB矩阵处理 1 常用的特殊矩阵函数 zeros函数&#xff1a; zeros(m):产生mm零矩阵 zeros(m,n):产生mn零矩阵 zeros(size(A)):产生与矩阵A相同大小的零矩阵 ones函数&#xff1a; 产生4阶全1矩阵 ones(4) eye函数&#xff1a; 产生对角线为1的矩阵&#xff0c…

分享随机数和唯一ID的工具类

随机数一般也是会被常使用到的&#xff0c;比如在造一些模拟测试数据的场景&#xff0c;或者说是非高端应用的场景会被使用。而全局唯一ID的使用则相反&#xff0c;应用场景更广&#xff0c;更专业&#xff0c;更科学&#xff0c;比如在批量保存数据时&#xff0c;需要提前生成…

CVE漏洞复现-CVE-2016-10033-远程命令执行

CVE-2016-10033-远程命令执行 PHPMailer是一个基于PHP语言的邮件发送组件&#xff0c;被广泛运用于诸如WordPress、Drupal、1CRM、SugarCRM、Yii、Joomla等用户量巨大的应用与框架中。 CVE-2016-10033是PHPMailer中存在的高危漏洞&#xff0c;这个高危漏洞是由 class.phpmail…

Java 17 新特性尝鲜

JDK 17更新了包括14个特性&#xff0c;具体如下表所示&#xff1a; Restore Always-StrictFloating-Point Semantics 恢复始终严格模式&#xff08;Always-Strict&#xff09;的浮点语义EnhancedPseudo-Random Number Generators 增强型伪随机数生成器New macOS RenderingPipe…

Spring boot结合SkyWalking-Trace工具类实现日志打印请求链路traceid

背景&#xff1a; 随着业务的复杂化、解耦化&#xff0c;运维人员和开发人员需要对请求链路跟踪来快速发现和定位问题&#xff0c;基于应用已经集成了SkyWalking的前提下&#xff0c;如何通过获取SkyWalking生成的统一traceId并加入打印日志中&#xff0c;方便开发人员能够根据…

露营好物推荐:极米轻薄投影仪Z6X Pro

温度回升&#xff0c;春意萌动&#xff0c;很多人开始计划春游、露营&#xff0c;打算和家人、朋友一起享受大自然的春日场景。漫天星光下&#xff0c;吃着美食、喝着小酒,再加上一场露天电影,逃离了城市的喧嚣,在大自然中尽情撒野,又有谁会不喜欢呢&#xff1f;如今众多露营爱…

matlab 实现常用的混沌映射(Tent, Sine, Sinusoidal, Piecewise, Logistic, Cubic, Chebyshev)

大部分混沌映射的系数是有限制的, 针对每个模型最优的混沌系数是不一样的, 因此混沌系数要根据自己的模型来定. 下面的系数都是根据我自己的模型而设定的. 混沌映射 1 Tent 映射2 Sine 映射3 Sinusoidal 映射4 Piecewise 映射5 Logistic 映射6 Cubic 映射7 Chebyshev 映射 1 Te…

松下机器人进行数据备份与恢复的具体方法

松下机器人进行数据备份与恢复的具体方法 数据备份 如下图所示,找到备份选项,按确认, 如下图所示,选择保存,按确认键, 如下图所示,选择USB存储设备,选择存储路径,按确认键, 选择需要备份的数据,如下图所示,默认情况下是勾选“全部数据”, 如下图所示,显…