首页
学习
活动
专区
工具
TVP
发布

皮振伟的专栏

专栏作者
108
文章
296312
阅读量
78
订阅数
[linux][qemu]PVPanic的缺陷和完善
前文《[linux][qemu]PVPanic的实现原理以及应用》中,介绍了pvpanic的原理和基本的使用方法,KVM虚拟化场景下,使用pvpanic驱动可以监控到Guest的panic。
皮振伟
2020-02-25
1.9K0
基于KVM虚拟化的混合部署
KVM forum 2019上,作者和同事的演讲主题是《How KVM-based Hybrid Deployment Powers Bytedance’s Biggest Day Ever》。 在这里详细展开一下,介绍一下基于KVM虚拟化的混合部署。下文的脉络大约是: 1,业务背景 2,为什么使用KVM虚拟化方案 3,在使用KVM虚拟化方案的过程中,我们做了那些改进 4,基于KVM虚拟化的混合部署方案取得了怎样的效果
皮振伟
2019-11-12
1.9K0
[Linux][seccomp]seccomp引起的SIGSYS问题 ​
前言 作者习惯使用Libvrit,多数情况下,会直接使用libvirt进行虚拟机操作。 如果要用qemu启动的情况,一般会比较习惯ps -ef | grep qemu得到qemu的启动参数,进行修改,然后启动。 在一次启动中,qemu发生了错误:qemu-system-x86_64: network script /etc/qemu-ifup failed with status 159 问题的原因是因为seccomp的配置导致的,那么我们就来看一下这个问题的具体表现。 分析 实例代码 构造一段实例代码,在父进程中初始化了seccomp,禁用了execve这个syscall,在子进程中尝试调用execve运行其他的程序。 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <seccomp.h> char *cmd = "/bin/ls"; int main() { int pid, status, ret; char *args[4]; char **parg; scmp_filter_ctx ctx; ctx = seccomp_init(SCMP_ACT_ALLOW); if (ctx == NULL) { printf("seccomp_init fail\n"); return 0; } ret = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(execve), 0); if (ret < 0) { printf("seccomp_rule_add fail\n"); return 0; } ret = seccomp_load(ctx); if (ret < 0) { printf("seccomp_load fail\n"); return 0; } seccomp_release(ctx); pid = fork(); if (pid == 0) { parg = args; *parg++ = cmd; *parg++ = "-al"; *parg++ = "/proc/self/fd"; *parg = NULL; execv(cmd, args); } else { while (waitpid(pid, &status, 0) != pid); printf("status %d\n", status); } return 0; } 需要先安装libseccomp-dev(apt-get install libseccomp-dev),编译的时候: gcc execv.c -g -o execv -lseccomp 运行可以发现,子进程并不是正常退出的。 打开coredump 调整/proc/sys/kernel/core_pattern,配置coredump文件生成的规则。 ulimit -c unlimited调整但前shell的coredump文件大小限制,在当前的shell下运行,文件大小生效。
皮振伟
2019-07-30
2.1K0
[x86][QEMU]虚拟化场景下的CPU拓扑
前言 目前的主流服务器一般是二路,即有2个NUMA node。每个NUMA上有一个CPU。比较主流的CPU一般是10Core/12Core,打开了Hyper-thread的场景下,就是2 Sockets × 10/12 Cores/socket × 2 Hyper-threads/Core,也就是40核或者48核。 对于大规格的虚拟机,尤其是32 vCPU或者40vCPU的场景下,对于计算密集型的业务,需要把物理机的CPU拓扑信息正确的透传到虚拟机中,否则跨Socket的内存访问,同一个Core下的两个Hyper-thread的资源的争抢,都是影响性能的关键因素。 分析 Host上拓扑关系 我们一般会用lscpu命令看到基本的CPU拓扑信息,也可以通过cat /proc/cpuinfo的方式看到“physical id”,“core id” cpuid 再进一步探讨,Host kernle是怎么获取到的CPU的拓扑关系的呢? Linux有命令cpuid,代码在https://github.com/tycho/cpuid cpuid命令的结果截取如下:
皮振伟
2019-05-16
2.6K0
[linux][kvm]模拟大量虚拟机遇到的问题
前言: 网络的同事希望模拟大量的虚拟机(万台数量级),又受到物理资源的限制,只能使用几台物理机。 遇到了各种奇奇怪怪的问题。 分析:
皮振伟
2019-05-06
1.3K0
[qemu][rbd]librbd连接overflow问题
前言: 后端存储使用Ceph卷,在虚拟机中执行mkfs的时候,遇到卡顿。 卡顿位置不确定,有时候是卡在Guest内部执行discard,有时候执行写superblock。 后来发现,是qemu进程的fd超出了限制导致。 分析: 1,discard 主流的存储,尤其是分布式存储,都是支持thin volume,甚至默认都是thin volume的。写时分配可以节省空间,也可以加快volume创建的速度。 排除是否是discard的问题,可以通过libvirt的配置控制开关。 打开discard,<driver discard='unmap'> 关闭discard,<driver discard='ignore'> 实验之后发现,并不是discard导致的。 2,strace 用strace -f -p QEMU-PID的方式来追踪qemu进程的syscall,可以发现,socket失败。 3,limits ls -al /proc/QEMU-PID/fd | wc -l可以确定当前的qemu已经打开的fd数量。 cat /proc/QEMU-PID/limits | grep “Max open files”可以确定当前的qemu最多可以打开的文件的数量,当然,其中也包括TCP连接数量。 发现,确实达到了阈值。 4,netstat netstat -apt | grep QEMU-PID | wc -l 可以发现,一个500G的volume,在Guest里面全盘随机IO之后,大约消耗了接近2K个TCP连接。 那么,就很容易解释为什么qemu的fd爆了。由于qemu的limits是从libvirtd继承过来的,所以,需要修改libvirtd的limits。 5,LimitNOFILE 由于libvirtd是systemd启动的,需要配置systemd的配置。 ibvirt中默认的参数是LimitNOFILE=8192。可以计算出来,可以支持的后端Ceph卷的数量。如果有挂载多个volume的需求,需要扩大这个配置参数。 6,librbd 需要注意的是,尽管因为fd耗尽导致socket失败,但是librbd的api并不会返回error,所以,在qemu的block driver中没有办法处理这个case,也不能report error。 上文修改参数的办法,可以让一个Guest正常工作。但是也有一定的风险。Host上TCP可用的端口共65536个,还有一部分已经reserve起来。 # cat /proc/sys/net/ipv4/ip_local_port_range 确定可用的范围,就可以计算出来一个Host上所有可用的TCP端口数量,进一步计算出来所有可以挂载的Ceph卷的数量。
皮振伟
2019-03-07
2.1K1
​[qemu][http]qemu的网络类型disk技术分析
前言: qemu的disk设备后端存储支持了多种类型。 本文简单简单列举几种,对比一下其中的特点。再重点分析http类型。 分析: 1,disk types qemu支持的disk类型,以及使用方法,参考libvirt的官方文档http://localhost/formatdomain.html#elementsDisks,其中常用的类型: file,就是文件类型,一般常用raw格式和qcow2格式。qemu-img info xxx.img可以查看具体类型和一些参数。对于file类型的数据,读写都需要经
皮振伟
2018-04-09
2.2K0
[virt][concept]虚拟化技术概论--KVM,QEMU,Libvirt
前言: 以作者的经验来看,虚拟化的跨度比较大,很多概念比较难以理解,本来以为“硬件行为,就是这样的”好多概念,都变成虚拟的了。 作者对kernel略懂一二,结合过往的很多经验来看,就更加难以理解了~ 所以,作者尝试着把理解的过程描述出来(尽管作者在虚拟化上面,谈不上很专业,这里还是不自量力一下了)。 分析: 硬件概念:在分析虚拟化原理之前,先来看一下“本来就应该这样”的硬件设计图。 从Intel官网(http://download.intel.com/design/chipsets/datashts/2
皮振伟
2018-04-09
1.9K0
[qemu][vnc]虚拟化平台上远程连接遇到的几个问题分析
前言: 虚拟化平台上,不管是调试,还是实际使用,都离不开远程连接。在使用vnc、spice的时候,遇到过一些问题。 分析: 1,frame buffer 先说一下物理原理。以我们的PC为例:假设显示器的分辨率是1920*1080,就意味着显示器是是一个1920*1080个pixel(像素)的矩形,每个pixel显示出来的颜色拼在一起,就组成了显示器上看到的内容了。 如果每个pixel是ARGB888格式的,也就是说它需要使用Alpha 8bit,Red 8bit,Green 8bit,Blue 8bit共
皮振伟
2018-04-09
5.9K1
[qemu][acpi]acpi overflow的分析
前言: qemu启动之后,打出了log: qemu-system-x86_64: Warning: ACPI tables are larger than 64k. qemu-system-x86_64: Warning: migration may not work. qemu-system-x86_64: Warning: please remove CPUs, NUMA nodes, memory slots or PCI bridges. 分析: 1,acpi build 源代码qemu-2.8
皮振伟
2018-04-09
3K0
[linux][network]虚拟网卡技术分析
前言: 虚拟化场景下的网卡虚拟化,就是让虚拟机觉得自己有网卡。就有了e1000/rtl8139为代表的物理网卡软件模拟实现;为了加速Guest和Host之间的数据交换速度,就有了virtio网卡;再virtio的基础上,为了减少qemu进程和host os之间的数据拷贝,就有了vhost-net。这几种情况下,都是完全使用软件模拟的网卡,使用TAP技术,虚拟化出来net device,再把对应的net device接入到网桥上,这样在虚拟机内存就可以向外部写数据了。 还有一类就是物理网卡提供了虚拟化能力。比
皮振伟
2018-04-09
4.5K0
[qemu][storage]qemu-img covnert的速度提高以及sparse file
前言: 虚拟化场景下,测试的时候,经常为了省事,经常想跳过安装操作系统。因为作者使用的是iscsi的分布式存储方案,所以可以用iscsiadm把iscsi挂载到host上,虚拟化出来/dev/sdx设备。 qemu-img convert -f qcow2 -O raw CentOS-7-x86_64-GenericCloud.qcow2 /dev/sdx 实际效果还不错,省去了安装操作系统的复杂过程。转换完成后,从/dev/sdx直接启动,guest os就带着操作系统了。 但是,还会看到转化速度比较慢
皮振伟
2018-04-09
3.8K0
没有更多了
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档