Lightsail 虚拟机 CPU 占用率100%的问题

Amazon Lightsail 的服务器各方面都挺好的,但最近遇到几次 CPU 占用率过高,甚至持续高达100%并导致服务器无法响应,只能关机重启的情况。

翻找一通之后,发现原因是 MySQL 服务的内存消耗较大,当峰值消耗超出内存上限后,最终导致 CPU 占用率异常。

解决办法有两个,一是直接升级内存配置;二是低成本的,不改变硬件配置的情况下,划分一部分磁盘空间来充当内存不足时的交换空间来解决。

好在这个问题不经常出现,服务器硬盘又是SSD,性能还可以,所以这里采用第二种方法先顶上。在默认配置下,Lightsail 服务器的硬盘分区里并没有划出 swap 分区,只能手工添加 swap 文件了。

操作步骤:

# 创建一个交换文件,大小自定,推荐内存*2
sudo fallocate -l 2G /swapfile

# 设置权限
sudo chmod 600 /swapfile

# 设置交换分区为此文件
sudo mkswap /swapfile

# 启用
sudo swapon /swapfile

# 查看是否生效
sudo swapon -s

# 设置开机自动挂载交换文件
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
linux 设置 swapfile 交换文件
linux 设置 swapfile 交换文件

其它参考:

全文完

Linux虚拟机读写exFat格式USB移动硬盘

这两天面临一个特定需求,遇到些问题,记录下。

需求:

我有一台安装了 ESXi 的服务器,其上运行了若干虚拟机,其中一台是 Ubuntu,我需要通过 USB 挂载一块新的硬盘到该虚拟机中,并分区格式化到 exFat 格式,最后将 Ubuntu 某特定文件夹的内容,完全同步到该硬盘中。

要解决的问题:

1,在 ESXi 下如何连接 USB 设备到虚拟机;
2,在 Linux 下对新硬盘的分区、格式化、挂载;
3,文件夹的同步过程及简单数据校验。

过程与小坑:

1,在ESXi下连接USB设备到虚拟机。

正常情况下,据官方文档讲只需将USB设备连接到服务器上,在ESXi的管理界面中,找到要使用这个USB设备的虚拟机,不必关机的情况下,直接编辑。

先检查虚拟机是否添加了USB控制器,若无请添加。然后添加其它设备,选中如下图所示的“USB设备”,从中选择具体的设备名称即可。

ESXi向虚拟机添加USB设备示例
图:ESXi向虚拟机添加USB设备示例

这里踩到第一个小坑,如上图所示,在我的虚拟机中,USB设备居然显示灰色无法添加,翻看官方文档,在这一篇中提到:

原因
出现此问题的原因是默认情况下不可引导的USB设备为虚拟机预留。该设备并不显示在主机的文件系统中,尽管lsusb可以看到设备。
解决方案
停止 usbarbitrator 服务:/etc/init.d/usbarbitrator stop
断开 USB 设备的物理连接然后再重新进行连接。
默认情况下,设备位置是 /vmfs/devices/disks/mpx.vmhbaXX:C0:T0:L0。
重新连接设备后,重新启动 usbarbitrator 服务:/etc/init.d/usbarbitrator start
重新启动 hostd 和任何运行中的虚拟机,以还原对虚拟机中直通设备的访问权限。

注意:这需要通过SSH连接到ESXi主机进行操作,而不是ESXi上运行的Ubuntu虚拟机。默认情况下ESXi主机的SSH服务是关闭的,可以在管理界面菜单开启,不复赘述。在完成了上述操作后,就可以成功将USB设备添加到Ubuntu虚拟机了。

2,在Linux下对新硬盘的分区、格式化、挂载;

SSH登录到虚拟机,用 fdisk -l 命令查看一下当前连接的设备,找到其中的硬盘,例如:/dev/sdc

输入 gdisk /dev/sdc 进行分区操作:
先按 o 创建一个空的GPT分区表。
再按 n 创建一个新的分区,参数自定,exFat格式的代码是0700
再按 p 显示当前分区信息,检查一下。
再按 w 写入,使上述操作生效。

输入 mkfs.exfat /dev/sdc1 格式化该分区。

我将整个硬盘只分了一个区,结果如图:

linux硬盘分区示例
图:linux硬盘分区示例

接下来挂载该磁盘:

输入 mkdir /mnt/usb 创建一个挂载点。
输入 mount -t exfat /dev/sdc1 /mnt/usb 挂载磁盘。

一切正常的话,已经可以通过 /mnt/usb 访问该磁盘了。
如果要拔掉USB设备的话,安全起见,需要先停止读写任务,
并输入 umount /dev/sdc1 卸载磁盘,最后拔线。

3,文件夹同步及数据校验。

一般情况下,只需要简单的 cp -r 命令复制文件夹即可。但如果文件夹内的数据过于庞大,需要长时间复制万一中断也方便恢复,或者有可能定期增量更新的话,还是应该用 rsync 命令来同步。

rsync -r --size-only /source /destination

这会将 /source 目录中所有的子目录和文件,都同步到 /destination 目录中。在多次运行该命令时,若遇到相同大小的文件会跳过,而不同大小的文件会复制。

我这次需要同步的文件夹相当庞大,数据大约有3TB左右,为了避免一直保持SSH连接,所以需要让任务在后台运行,这就需要用到 nohup 命令

nohup rsync -r --size-only /source /destination &> /dev/null & echo $! > pid.txt

这会使 rsync 任务在后台运行,同时在当前目录下生成一个 pid.txt 文件记录这个任务的pid,方便后续 kill job

在漫长的同步过程中,如果想看 rsync 是否还在进行中,可以用 iotop 命令

iotop -o

这会显示当前有 I/O 操作的所有任务及其读写速率,如图:

ubuntu系统iotop命令示例
图:Linux Ubuntu系统 iotop 命令示例

这里显示 rsync 还在以 106M/s 的速度读写磁盘。

任务正常结束后,rsync 会确保文件夹内容的一致性,但如果中途中断或有其它异常情况,想要确认一下的话,可以使用 du 命令

du -s --apparent-size /source

这会以字节为单位,显示 /source 目录下所有文件大小之和。
同样的方法查看一下 /destination 目录的大小,对比即可。

注意:这里的 --apparent-size 参数特别说明下,如果不加这个参数的话,统计的就是文件占用磁盘的字节数,当两个磁盘有着不同的簇大小时,这会导致即使文件完全相同而显示的数字却不同。整体而言,用 du 命令对比目录字节数,是一种简单高效而不甚严谨的方法。

全文完。

引用:

  1. ESXi文档:将 USB 设备从 ESXi 主机添加到虚拟机
  2. ESXi文档:无法将数据从 ESXi 主机复制到连接到该主机的 USB 设备