目前已知的3种方法都有一定的局限性,不能很完美实现当进程内存泄漏时杀掉进程
1. systemd的服务配置中增加MemoryMax=XXX的配置项,该配置项仅能限住物理内存,如何服务器未配置swap,内存达到时则会触发oom杀掉进程。如果服务器配置swap,将继续消耗swap直到swap也消耗完,systemd还有一个MemorySwapMax=XXX配置项可以限制swap,但是除非很新的操作系统使用了cgroup2该配置项才能生效。
2. systemd配置的MemoryMax=XXX参数,会同时作用到被主进程拉起的其他进程,如主进程拉起mysql进程,虽然systemd的MemoryMax参数是作用在主进程上,但是mysql会继承该限制。原因是MemoryMax参数是通过cgroup生效的,systemd启动的主进程和子进程都将在该cgroup组中。
3. ulimit和prlimit设置进程最大内存地址,这两种方式是作用在系统函数行为上,比如malloc分配内存时被限制了内存上限,内存分配不出来的时候panic,但是如果上层调用捕获了这个异常,程序就不会退出了,并不会处罚oom杀掉进程。
当前机器cgroup为v1,若是v2将显示为cgroup2fs
测试脚本
该脚本使用python构造一个很大的内存,触发方式是在/root下创建start文件,touch /root/start
,用其他语言可以类似
程序运行过程中发现有内存泄漏,需要主动触发coredump用于分析,可以按以下步骤操作
本质是通过kill
命令发送信号触发coredump
,可以触发的信号有很多,常用的的信号SIGABRT
或SIGSEGV
温故知新,任何一个初学linux的教程,都会介绍man的使用,以前感觉作用不大
偶尔在别人的博文中看到man的介绍,才正儿八经的看了下man的使用,记录一下
通过几个例子介绍下不同类别的帮助信息
操作系统默认带有man命令,但是内容显示的比较少,需要安装补充内容
部分帮助信息有中文版本,可以通过安装下面的包获取中文帮助信息
温故知新,任何一个初学linux的教程,都会介绍man的使用,以前感觉作用不大
偶尔在别人的博文中看到man的介绍,才正儿八经的看了下man的使用,记录一下
通过几个例子介绍下不同类别的帮助信息
操作系统默认带有man命令,但是内容显示的比较少,需要安装补充内容
部分帮助信息有中文版本,可以通过安装下面的包获取中文帮助信息
方法一 通过setopt参数覆盖默认reposdir配置
setopt
的作用是可以设置/etc/yum.conf中的属性值,也可以说是覆盖那些属性信息。
方法二 修改/etc/yum.conf配置文件,指定reposdir参数
寻找mount源码来源util-linux-xxx/sys-utils/mount.c
中mk_exit_code
函数
结论:
如代码所示,当底层存储返回EACCES
或EROFS
错误返回码,会给出相应的提示,然后通过goto try_readonly;
重新以readonly的方式尝试挂载。
所以mount只是在第一次挂载是感知到错误后,尝试以readonly的方式挂载。
qemu要运行aarch64必须先安装aarch64支持:qemu-system-aarch64,centos/rhel下该包需要自己编译安装,Fedora源带该包,为简单操作本文直接在Fedora上实践
宿主机选用的Fedora版本 : Fedora-Server-dvd-x86_64-30-1.2.iso
虚拟机选用的rhel-7.4-aarch64版本 : rhel-alt-server-7.4-aarch64-dvd.iso
(用centos的aarch64也可以)
配置桥接目的是在后面安装好的aarch64系统里面可以配置和宿主机Fedora在同一个网段的IP,如果不需要桥接,该章节可以跳过
1.配置dns,保证机器可以使用公网网络源
2.额外添加几个盘,作为数据盘,此处我加了/dev/vdb /dev/vdc /dev/vdd三块100G的盘
添加centos源和epel源,本文全部使用阿里云的源
添加ceph源,在/etc/yum.repos.d/目录下创建ceph.repo
文件,粘贴以下内容
先将.vmdk
格式转换为.qcow2
安装依赖包后就可以挂载了,/tmp/x
目录下就是镜像里面的文件了
问题一,找不到libvirt服务,可能是libvirtd
没有启动,启动一下即可
点击 “文件->新建” 此处的ip改成你自己服务器的IP,上面的名称无所谓
购买云主机时,如果选的密钥验证的话,此处必须使用密钥登录,.pem是你在阿里云控制台创建密钥的时候生产的,在阿里云控制台上应该也可以下载