Gregory Bartholomew 发布的文章

在 Linux 系统上管理系统资源的推荐工具是 cgroups。虽然在可以调整的限制方面(CPU、内存、磁盘 I/O、网络等)非常强大,但配置 cgroups 并不简单。nice) 命令从 1973 年起就可以使用了。但它只是调整在一个处理器上竞争时间的进程之间的调度优先级。nice 命令不会限制一个进程在单位时间内所能消耗的 CPU 周期的百分比。cpulimit 命令提供了两个世界的最佳方案。它限制了一个进程在每单位时间内可以分配的 CPU 周期的百分比,而且相对容易调用。

cpulimit 命令主要对长期运行的和 CPU 密集型的进程有用。编译软件和转换视频是长期运行的进程的常见例子,它们可以使计算机的 CPU 使用率达到最大。限制这类进程的 CPU 使用率将释放出处理器时间,供计算机上可能运行的其他任务使用。限制 CPU 密集型进程也将减少功耗及热输出,并可能减少系统的风扇噪音。限制一个进程的 CPU 使用率的代价是,它需要更多的时间来完成运行。

安装 cpulimit

cpulimit 命令在默认的 Fedora Linux 仓库中可用。运行下面的命令,在 Fedora Linux 系统上安装 cpulimit

$ sudo dnf install cpulimit

查看 cpulimit 的文档

cpulimit 软件包并没有附带的手册页。使用下面的命令来查看 cpulimit 的内置文档。输出结果在下面提供。但你可能需要在你自己的系统上运行该命令,以防止自本文编写以来选项发生变化。

$ cpulimit --help
Usage: cpulimit [OPTIONS…] TARGET
   OPTIONS
      -l, --limit=N percentage of cpu allowed from 0 to 800 (required)
      -v, --verbose show control statistics
      -z, --lazy exit if there is no target process, or if it dies
      -i, --include-children limit also the children processes
      -h, --help display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N pid of the process (implies -z)
      -e, --exe=FILE name of the executable program file or path name
      COMMAND [ARGS] run this command and limit it (implies -z)

演示

为了演示 cpulimit 命令的使用方式,下面提供了一个精心设计的、计算量很大的 Python 脚本。该脚本首先在没有限制的情况下运行,然后在限制为 50% 的情况下运行。它计算的是第 42 个 斐波那契数 的值。该脚本在这两种情况下都作为 time 命令的子进程运行,以显示计算答案所需的总时间。

$ /bin/time -f '(computed in %e seconds)' /bin/python -c 'f = lambda n: n if n<2 else f(n-1)+f(n-2); print(f(42), end=" ")'
267914296 (computed in 51.80 seconds)
$ /bin/cpulimit -i -l 50 /bin/time -f '(computed in %e seconds)' /bin/python -c 'f = lambda n: n if n<2 else f(n-1)+f(n-2); print(f(42), end=" ")'
267914296 (computed in 127.38 seconds)

当运行第一个版本的命令时,你可能会听到电脑上的 CPU 风扇转动起来。但在运行第二个版本时,你应该不会。第一个版本的命令不受 CPU 的限制,但它不应该导致你的电脑陷入瘫痪。它是以这样一种方式编写的:它最多只能使用一个 CPU 核心。大多数现代 PC 都有多个 CPU 核心,当其中一个 CPU 100% 繁忙时,可以毫无困难地同时运行其他任务。为了验证第一条命令是否使你的一个处理器达到最大,在一个单独的终端窗口中运行 top 命令并按下 1 键。要退出 top 命令可以按 Q 键。

设置高于 100% 的限制只对能够进行 任务并行化 的程序有意义。对于这样的程序,高于 100% 的增量代表一个 CPU 的全部利用率(200%=2 个CPU,300%=3 个CPU,等等)。

注意,在上面的例子中,-i 选项已经传递给 cpulimit 命令。这是必要的,因为要限制的命令不是 cpulimit 命令的直接子进程。相反,它是 time 命令的一个子进程,而后者又是 cpulimit 命令的一个子进程。如果没有 -i 选项,cpulimit 将只限制 time 命令。

最后说明

如果你想限制一个从桌面图标启动的图形程序,请将该程序的 .desktop 文件(通常位于 /usr/share/applications 目录下)复制到你的 ~/.local/share/applications 目录下,并相应修改 Exec 行。然后运行下面的命令来应用这些变化:

$ update-desktop-database ~/.local/share/applications

via: https://fedoramagazine.org/use-cpulimit-to-free-up-your-cpu/

作者:Gregory Bartholomew 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Fedora 33 Workstation 是我们这个免费的、领先的操作系统的最新版本。你现在就可以从官方网站下载它。Fedora 33 Workstation 中有一些新的和值得注意的变化。请阅读如下更多细节。

GNOME 3.38

Fedora 33 Workstation 为各类用户提供了最新版本的 GNOME 桌面环境。在 Fedora 33 Workstation 中的 GNOME 3.38 包含了许多更新和改进,包括:

一个新的 GNOME Tour 应用

现在,新用户会看到一个“新的 Tour 应用,重点展示了桌面的主要功能,并为第一次使用 GNOME 的用户提供一个很好的欢迎页”。

The new GNOME Tour application in Fedora 33

拖动重排序应用

GNOME 3.38 用一个单一的可定制的、一致的视图取代了之前分开的“常用”和“所有”应用视图,这允许你重新排列应用并将它们组织到自定义文件夹中。只需点击并拖动即可移动应用。

GNOME 3.38 Drag to Reorder

改进屏幕录制

GNOME Shell 中的屏幕录制基础架构已被改进,以利用 PipeWire 和内核 API。这将有助于减少资源消耗并提高响应速度。

GNOME 3.38 还提供了许多额外的功能和改进。查看 GNOME 3.38 发行说明以获得更多信息。

B-tree 文件系统

正如之前宣布的,新安装的 Fedora 33 将默认使用 Btrfs。每一个新的内核版本都会为 Btrfs 增加一些特性和增强功能。变更日志有一个完整的总结,它介绍了每个新内核版本给 Btrfs 带来的功能。

Swap on ZRAM

Anaconda 和 Fedora IoT 多年来一直默认使用 swap-on-zram。在 Fedora 33 中,将默认启用 swap-on-zram,而不是交换分区。查看 Fedora wiki 页面了解更多关于 swap-on-zram 的细节。

默认使用 Nano

新的 Fedora 33 将把 EDITOR 环境变量默认设置为 nano。这个变化影响了一些命令行工具,当它们需要用户输入时,会打开一个文本编辑器。在早期的版本中,这个环境变量的默认值并没有被指定,而是由各个应用程序来选择一个默认的编辑器。通常情况下,应用程序会使用 vi 作为它们的默认编辑器,因为它是一个小应用,通常在大多数 Unix/Linux 操作系统的基础安装中都可以使用。由于 Fedora 33 的基本安装中包含了 nano,而且 nano 对于初学者来说更加直观,所以 Fedora 33 将默认使用 nano。当然,想要使用 vi 的用户可以在自己的环境中覆盖 EDITOR 变量的值。详见Fedora 修改请求获取更多信息。


via: https://fedoramagazine.org/whats-new-fedora-33-workstation/

作者:Gregory Bartholomew 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Live CD 对于很多任务是很有用的,例如:

  • 将操作系统安装到一个硬盘驱动器
  • 修复一个启动加载程序或执行其它救援模式操作
  • 为 Web 浏览提供一个相适应的最小环境
  • …以及更多的东西

作为使用 DVD 和 USB 驱动器来存储你的 Live CD 镜像是一个替代方案,你可以上传它们到一个不太可能丢失或损坏的 iSCSI 服务器中。这个指南向你展示如何加载你的 Live CD 镜像到一个 ISCSI 服务器上,并使用 iPXE 启动加载程序来访问它们。

下载一个 Live CD 镜像

$ MY_RLSE=27
$ MY_LIVE=$(wget -q -O - https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/$MY_RLSE/Workstation/x86_64/iso | perl -ne '/(Fedora[^ ]*?-Live-[^ ]*?\.iso)(?{print $^N})/;')
$ MY_NAME=fc$MY_RLSE 
$ wget -O $MY_NAME.iso https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/$MY_RLSE/Workstation/x86_64/iso/$MY_LIVE

上面的命令下载 Fedora-Workstation-Live-x86_64-27-1.6.iso Fedora Live 镜像,并保存为 fc27.iso。更改 MY_RLSE 的值来下载其它档案版本。或者,你可以浏览 https://getfedora.org/ 来下载最新的 Fedora live 镜像。在 21 之前的版本使用不同的命名约定,必需在这里手动下载。如果你手动下载一个 Live CD 镜像,设置 MY_NAME 变量为不带有扩展名的文件的基本名称。用此方法,下面部分中命令将引用正确的文件。

转换 Live CD 镜像

使用 livecd-iso-to-disk 工具来转换 ISO 文件为一个磁盘镜像,并添加 netroot 参数到嵌入的内核命令行:

$ sudo dnf install -y livecd-tools
$ MY_SIZE=$(du -ms $MY_NAME.iso | cut -f 1)
$ dd if=/dev/zero of=$MY_NAME.img bs=1MiB count=0 seek=$(($MY_SIZE+512)) 
$ MY_SRVR=server-01.example.edu 
$ MY_RVRS=$(echo $MY_SRVR | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_SRVR}) 
$ MY_LOOP=$(sudo losetup --show --nooverlap --find $MY_NAME.img) 
$ sudo livecd-iso-to-disk --format --extra-kernel-args netroot=iscsi:$MY_SRVR:::1:iqn.$MY_RVRS:$MY_NAME $MY_NAME.iso $MY_LOOP 
$ sudo losetup -d $MY_LOOP

上传 Live 镜像到你的服务器

在你的 ISCSI 服务器上创建一个目录来存储你的 live 镜像,随后上传你修改的镜像到其中。

对于 21 及更高发布版本:

$ MY_FLDR=/images 
$ scp $MY_NAME.img $MY_SRVR:$MY_FLDR/

对于 21 以前发布版本:

$ MY_FLDR=/images 
$ MY_LOOP=$(sudo losetup --show --nooverlap --find --partscan $MY_NAME.img) 
$ sudo tune2fs -O ^has_journal ${MY_LOOP}p1 
$ sudo e2fsck ${MY_LOOP}p1 
$ sudo dd status=none if=${MY_LOOP}p1 | ssh $MY_SRVR "dd of=$MY_FLDR/$MY_NAME.img" 
$ sudo losetup -d $MY_LOOP

定义 iSCSI 目标

在你的 iSCSI 服务器上运行下面的命令:

$ sudo -i 
# MY_NAME=fc27 
# MY_FLDR=/images 
# MY_SRVR=`hostname` 
# MY_RVRS=$(echo $MY_SRVR | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_SRVR}) 
# cat << END > /etc/tgt/conf.d/$MY_NAME.conf 
<target iqn.$MY_RVRS:$MY_NAME>
    backing-store $MY_FLDR/$MY_NAME.img
    readonly 1
    allow-in-use yes 
</target> 
END 
# tgt-admin --update ALL

创建一个可启动 USB 驱动器

iPXE 启动加载程序有一个 sanboot 命令,你可以使用它来连接并启动托管于你 ISCSI 服务器上运行的 live 镜像。它可以以很多不同的格式编译。最好的工作格式依赖于你正在运行的硬件。例如,下面的说明向你展示如何在一个 USB 驱动器上从 syslinux链式加载 iPXE。

首先,下载 iPXE,并以它的 lkrn 格式构建。这应该作为一个工作站上的普通用户完成:

$ sudo dnf install -y git 
$ git clone http://git.ipxe.org/ipxe.git $HOME/ipxe 
$ sudo dnf groupinstall -y "C Development Tools and Libraries"
$ cd $HOME/ipxe/src 
$ make clean 
$ make bin/ipxe.lkrn 
$ cp bin/ipxe.lkrn /tmp

接下来,准备一个带有一个 MSDOS 分区表和一个 FAT32 文件系统的 USB 驱动器。下面的命令假设你已经连接将要格式化的 USB 驱动器。注意:你要格式正确的驱动器!

$ sudo -i 
# dnf install -y parted util-linux dosfstools 
# echo; find /dev/disk/by-id ! -regex '.*-part.*' -name 'usb-*' -exec readlink -f {} \; | xargs -i bash -c "parted -s {} unit MiB print | perl -0 -ne '/^Model: ([^(]*).*\n.*?([0-9]*MiB)/i && print \"Found: {} = \$2 \$1\n\"'"; echo; read -e -i "$(find /dev/disk/by-id ! -regex '.*-part.*' -name 'usb-*' -exec readlink -f {} \; -quit)" -p "Drive to format: " MY_USB
# umount $MY_USB? 
# wipefs -a $MY_USB 
# parted -s $MY_USB mklabel msdos mkpart primary fat32 1MiB 100% set 1 boot on 
# mkfs -t vfat -F 32 ${MY_USB}1

最后,在 USB 驱动器上安装并配置 syslinux ,来链式加载 iPXE:

# dnf install -y syslinux-nonlinux 
# syslinux -i ${MY_USB}1 
# dd if=/usr/share/syslinux/mbr.bin of=${MY_USB} 
# MY_MNT=$(mktemp -d) 
# mount ${MY_USB}1 $MY_MNT 
# MY_NAME=fc27 
# MY_SRVR=server-01.example.edu 
# MY_RVRS=$(echo $MY_SRVR | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_SRVR}) 
# cat << END > $MY_MNT/syslinux.cfg
ui menu.c32
default $MY_NAME
timeout 100
menu title SYSLINUX
label $MY_NAME
    menu label ${MY_NAME^^}
    kernel ipxe.lkrn
    append dhcp && sanboot iscsi:$MY_SRVR:::1:iqn.$MY_RVRS:$MY_NAME
END 
# cp /usr/share/syslinux/menu.c32 $MY_MNT 
# cp /usr/share/syslinux/libutil.c32 $MY_MNT 
# cp /tmp/ipxe.lkrn $MY_MNT 
# umount ${MY_USB}1

通过简单地编辑 syslinux.cfg 文件,并添加附加的菜单项,你应该能够使用这同一个 USB 驱动器来网络启动附加的 ISCSI 目标。

这仅是加载 IPXE 的一种方法。你可以直接在你的工作站上安装 syslinux 。再一种选项是编译 iPXE 为一个 EFI 可执行文件,并直接放置它到你的 ESP 中。又一种选项是编译 iPXE 为一个 PXE 加载器,并放置它到你的能够被 DHCP 引用的 TFTP 服务器。最佳的选项依赖于的环境

最后说明

  • 如果你以 IPXE 的 EFI 格式编译 IPXE ,你可能想添加 –filename \EFI\BOOT\grubx64.efi 参数到 sanboot 命令。
  • 能够创建自定义 live 镜像。更多信息参考创建和使用 live CD
  • 可以添加 –overlay-size-mb–home-size-mb 参数到 livecd-iso-to-disk 命令来创建永久存储的 live 镜像。然而,如果你有多个并发用户,你将需要设置你的 ISCSI 服务器来管理独立的每个用户的可写覆盖。这与 “如何构建一个网络启动服务器,部分 4” 一文所示类似。
  • Live 镜像在它们的内核命令行中支持一个 persistenthome 选项(例如, persistenthome=LABEL=HOME)。与经过 CHAP 身份验证的 iSCSI 目标一起使用,对于中心控制主目录,persistenthome 选项为 NFS 提供一个有趣的替代方案。

via: https://fedoramagazine.org/netboot-a-fedora-live-cd/

作者:Gregory Bartholomew 选题:lujun9972 译者:robsean 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

交流是非常重要的。你的电脑可能正试图告诉你一些重要的事情。但是,如果你没有正确配置邮件传输代理(MTA),那么你可能不会收到通知。Postfix 是一个易于配置且以强大的安全记录而闻名)的 MTA。遵循以下步骤,以确保从本地服务发送的电子邮件通知将通过 Postfix MTA 路由到你的互联网电子邮件账户中。

安装软件包

使用 dnf 来安装一些必须软件包(你应该配置了 sudo,对吧?):

$ sudo -i
# dnf install postfix mailx

如果以前配置了不同的 MTA,那么你可能需要将 Postfix 设置为系统默认。使用 alternatives 命令设置系统默认 MTA:

$ sudo alternatives --config mta
There are 2 programs which provide 'mta'.
  Selection    Command
*+ 1           /usr/sbin/sendmail.sendmail
   2           /usr/sbin/sendmail.postfix
Enter to keep the current selection[+], or type selection number: 2

创建一个 password\_maps 文件

你需要创建一个 Postfix 查询表条目,其中包含你要用于发送电子邮件账户的地址和密码:

# [email protected]
# MY_EMAIL_PASSWORD=abcdefghijklmnop
# MY_SMTP_SERVER=smtp.gmail.com
# MY_SMTP_SERVER_PORT=587
# echo "[$MY_SMTP_SERVER]:$MY_SMTP_SERVER_PORT $MY_EMAIL_ADDRESS:$MY_EMAIL_PASSWORD" >> /etc/postfix/password_maps
# chmod 600 /etc/postfix/password_maps
# unset MY_EMAIL_PASSWORD
# history -c

如果你使用的是 Gmail 账户,那么你需要为 Postfix 配置一个“应用程序密码”而不是使用你的 Gmail 密码。有关配置应用程序密码的说明,参阅“使用应用程序密码登录”。

接下来,你必须对 Postfix 查询表运行 postmap 命令,以创建或更新 Postfix 实际使用的文件的散列版本:

# postmap /etc/postfix/password_maps

散列后的版本将具有相同的文件名,但后缀为 .db

更新 main.cf 文件

更新 Postfix 的 main.cf 配置文件,以引用刚刚创建 Postfix 查询表。编辑该文件并添加以下行:

relayhost = smtp.gmail.com:587
smtp_tls_security_level = verify
smtp_tls_mandatory_ciphers = high
smtp_tls_verify_cert_match = hostname
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/password_maps

这里假设你使用 Gmail 作为 relayhost 设置,但是你可以用正确的主机名和端口替换系统应该将邮件发送到的邮件主机。

有关上述配置选项的最新详细信息,参考 man 帮助:

$ man postconf.5

启用、启动和测试 Postfix

更新 main.cf 文件后,启用并启动 Postfix 服务:

# systemctl enable --now postfix.service

然后,你可以使用 exit 命令或 Ctrl+D 以 root 身份退出 sudo 会话。你现在应该能够使用 mail 命令测试你的配置:

$ echo 'It worked!' | mail -s "Test: $(date)" [email protected]

更新服务

如果你安装了像 logwatchmdadmfail2banapcupsdcertwatch 这样的服务,你现在可以更新它们的配置,以便它们的电子邮件通知转到你的 Internet 电子邮件地址。

另外,你可能希望将发送到本地系统 root 账户的所有电子邮件都转到互联网电子邮件地址中,将以下行添加到系统的 /etc/alises 文件中(你需要使用 sudo 编辑此文件,或首先切换到 root 账户):

root: [email protected]

现在运行此命令重新读取别名:

# newaliases
  • 提示: 如果你使用的是 Gmail,那么你可以在用户名和 @ 符号之间添加字母数字标记,如上所示,以便更轻松地识别和过滤从计算机收到的电子邮件。

常用命令

查看邮件队列:

$ mailq

清除队列中的所有电子邮件:

# postsuper -d ALL

过滤设置,以获得感兴趣的值:

$ postconf | grep "^relayhost\|^smtp_"

查看 postfix/smtp 日志:

$ journalctl --no-pager -t postfix/smtp

进行配置更改后重新加载 postfix:

$ systemctl reload postfix

via: https://fedoramagazine.org/use-postfix-to-get-email-from-your-fedora-system/

作者:Gregory Bartholomew 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本文包含一些示例命令,向你展示如何使用 dd 命令粗略估计硬盘驱动器和 RAID 阵列的性能。准确的测量必须考虑诸如写入放大系统调用开销之类的事情,本指南不会考虑这些。对于可能提供更准确结果的工具,你可能需要考虑使用 hdparm

为了分解与文件系统相关的性能问题,这些示例显示了如何通过直接读取和写入块设备来在块级测试驱动器和阵列的性能。警告写入测试将会销毁用来运行测试的块设备上的所有数据。不要对包含你想要保留的数据的任何设备运行这些测试!

四个测试

下面是四个示例 dd 命令,可用于测试块设备的性能:

1、 从 $MY_DISK 读取的一个进程:

# dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache

2、写入到 $MY_DISK 的一个进程:

# dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct

3、从 $MY_DISK 并发读取的两个进程:

# (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache &); (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache skip=200 &)

4、 并发写入到 $MY_DISK 的两个进程:

# (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct &); (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct skip=200 &)
  • 执行读写测试时,相应的 iflag=nocacheoflag=direct 参数非常重要,因为没有它们,dd 命令有时会显示从内存中传输数据的结果速度,而不是从硬盘。
  • bscount 参数的值有些随意,我选择的值应足够大,以便在大多数情况下为当前硬件提供合适的平均值。
  • nullzero 设备在读写测试中分别用于目标和源,因为它们足够快,不会成为性能测试中的限制因素。
  • 并发读写测试中第二个 dd 命令的 skip=200 参数是为了确保 dd 的两个副本在硬盘驱动器的不同区域上运行。

16 个示例

下面是演示,显示针对以下四个块设备中之一运行上述四个测试中的各个结果:

  1. MY_DISK=/dev/sda2(用在示例 1-X 中)
  2. MY_DISK=/dev/sdb2(用在示例 2-X 中)
  3. MY_DISK=/dev/md/stripped(用在示例 3-X 中)
  4. MY_DISK=/dev/md/mirrored(用在示例 4-X 中)

首先将计算机置于救援模式,以减少后台服务的磁盘 I/O 随机影响测试结果的可能性。警告:这将关闭所有非必要的程序和服务。在运行这些命令之前,请务必保存你的工作。你需要知道 root 密码才能进入救援模式。passwd 命令以 root 用户身份运行时,将提示你(重新)设置 root 帐户密码。

$ sudo -i
# passwd
# setenforce 0
# systemctl rescue

你可能还想暂时禁止将日志记录到磁盘:

# sed -r -i.bak 's/^#?Storage=.*/Storage=none/' /etc/systemd/journald.conf
# systemctl restart systemd-journald.service

如果你有交换设备,可以暂时禁用它并用于执行后面的测试:

# swapoff -a
# MY_DEVS=$(mdadm --detail /dev/md/swap | grep active | grep -o "/dev/sd.*")
# mdadm --stop /dev/md/swap
# mdadm --zero-superblock $MY_DEVS

示例 1-1 (从 sda 读取)

# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 1)
# dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.7003 s, 123 MB/s

示例 1-2 (写入到 sda)

# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 1)
# dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.67117 s, 125 MB/s

示例 1-3 (从 sda 并发读取)

# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 1)
# (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache &); (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.42875 s, 61.2 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.52614 s, 59.5 MB/s

示例 1-4 (并发写入到 sda)

# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 1)
# (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct &); (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct skip=200 &)
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.2435 s, 64.7 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.60872 s, 58.1 MB/s

示例 2-1 (从 sdb 读取)

# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 2)
# dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.67285 s, 125 MB/s

示例 2-2 (写入到 sdb)

# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 2)
# dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.67198 s, 125 MB/s

示例 2-3 (从 sdb 并发读取)

# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 2)
# (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache &); (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.52808 s, 59.4 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.57736 s, 58.6 MB/s

示例 2-4 (并发写入到 sdb)

# MY_DISK=$(echo $MY_DEVS | cut -d ' ' -f 2)
# (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct &); (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.7841 s, 55.4 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 3.81475 s, 55.0 MB/s

示例 3-1 (从 RAID0 读取)

# mdadm --create /dev/md/stripped --homehost=any --metadata=1.0 --level=0 --raid-devices=2 $MY_DEVS
# MY_DISK=/dev/md/stripped
# dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 0.837419 s, 250 MB/s

示例 3-2 (写入到 RAID0)

# MY_DISK=/dev/md/stripped
# dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 0.823648 s, 255 MB/s

示例 3-3 (从 RAID0 并发读取)

# MY_DISK=/dev/md/stripped
# (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache &); (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.31025 s, 160 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.80016 s, 116 MB/s

示例 3-4 (并发写入到 RAID0)

# MY_DISK=/dev/md/stripped
# (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct &); (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.65026 s, 127 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.81323 s, 116 MB/s

示例 4-1 (从 RAID1 读取)

# mdadm --stop /dev/md/stripped
# mdadm --create /dev/md/mirrored --homehost=any --metadata=1.0 --level=1 --raid-devices=2 --assume-clean $MY_DEVS
# MY_DISK=/dev/md/mirrored
# dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.74963 s, 120 MB/s

示例 4-2 (写入到 RAID1)

# MY_DISK=/dev/md/mirrored
# dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.74625 s, 120 MB/s

示例 4-3 (从 RAID1 并发读取)

# MY_DISK=/dev/md/mirrored
# (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache &); (dd if=$MY_DISK of=/dev/null bs=1MiB count=200 iflag=nocache skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.67171 s, 125 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 1.67685 s, 125 MB/s

示例 4-4 (并发写入到 RAID1)

# MY_DISK=/dev/md/mirrored
# (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct &); (dd if=/dev/zero of=$MY_DISK bs=1MiB count=200 oflag=direct skip=200 &)
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 4.09666 s, 51.2 MB/s
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 4.1067 s, 51.1 MB/s

恢复交换设备和日志配置

# mdadm --stop /dev/md/stripped /dev/md/mirrored
# mdadm --create /dev/md/swap --homehost=any --metadata=1.0 --level=1 --raid-devices=2 $MY_DEVS
# mkswap /dev/md/swap
# swapon -a
# mv /etc/systemd/journald.conf.bak /etc/systemd/journald.conf
# systemctl restart systemd-journald.service
# reboot

结果解读

示例 1-1、1-2、2-1 和 2-2 表明我的每个驱动器以大约 125 MB/s 的速度读写。

示例 1-3、1-4、2-3 和 2-4 表明,当在同一驱动器上并行完成两次读取或写入时,每个进程的驱动器带宽大约为一半(60 MB/s)。

3-X 示例显示了将两个驱动器放在 RAID0(数据条带化)阵列中的性能优势。在所有情况下,这些数字表明 RAID0 阵列的执行速度是任何一个驱动器能够独立提供的速度的两倍。相应的是,丢失所有内容的可能性也是两倍,因为每个驱动器只包含一半的数据。一个三个驱动器阵列的执行速度是单个驱动器的三倍(所有驱动器规格都相同),但遭受灾难性故障的可能也是三倍。

4-X 示例显示 RAID1(数据镜像)阵列的性能类似于单个磁盘的性能,除了多个进程同时读取的情况(示例4-3)。在多个进程读取的情况下,RAID1 阵列的性能类似于 RAID0 阵列的性能。这意味着你将看到 RAID1 的性能优势,但仅限于进程同时读取时。例如,当你在前台使用 Web 浏览器或电子邮件客户端时,进程会尝试访问后台中的大量文件。RAID1 的主要好处是,如果驱动器出现故障,你的数据不太可能丢失。

故障排除

如果上述测试未按预期执行,则可能是驱动器坏了或出现故障。大多数现代硬盘都内置了自我监控、分析和报告技术(SMART)。如果你的驱动器支持它,smartctl 命令可用于查询你的硬盘驱动器的内部统计信息:

# smartctl --health /dev/sda
# smartctl --log=error /dev/sda
# smartctl -x /dev/sda

另一种可以调整 PC 以获得更好性能的方法是更改 I/O 调度程序。Linux 系统支持多个 I/O 调度程序,Fedora 系统的当前默认值是 deadline 调度程序的 multiqueue 变体。默认情况下它的整体性能非常好,并且对于具有许多处理器和大型磁盘阵列的大型服务器,其扩展性极为出色。但是,有一些更专业的调度程序在某些条件下可能表现更好。

要查看驱动器正在使用的 I/O 调度程序,请运行以下命令:

$ for i in /sys/block/sd?/queue/scheduler; do echo "$i: $(<$i)"; done

你可以通过将所需调度程序的名称写入 /sys/block/<device name>/queue/scheduler 文件来更改驱动器的调度程序:

# echo bfq > /sys/block/sda/queue/scheduler

你可以通过为驱动器创建 udev 规则来永久更改它。以下示例显示了如何创建将所有的旋转式驱动器设置为使用 BFQ I/O 调度程序的 udev 规则:

# cat << END > /etc/udev/rules.d/60-ioscheduler-rotational.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
END

这是另一个设置所有的固态驱动器使用 NOOP I/O 调度程序的示例:

# cat << END > /etc/udev/rules.d/60-ioscheduler-solid-state.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
END

更改 I/O 调度程序不会影响设备的原始吞吐量,但通过优先考虑后台任务的带宽或消除不必要的块重新排序,可能会使你的 PC 看起来响应更快。


via: https://fedoramagazine.org/check-storage-performance-with-dd/

作者:Gregory Bartholomew 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

mdadm 是 多磁盘和设备管理 Multiple Disk and Device Administration 的缩写。它是一个命令行工具,可用于管理 Linux 上的软件 RAID 阵列。本文概述了使用它的基础知识。

以下 5 个命令是你使用 mdadm 的基础功能:

  1. 创建 RAID 阵列mdadm --create /dev/md/test --homehost=any --metadata=1.0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
  2. 组合(并启动)RAID 阵列mdadm --assemble /dev/md/test /dev/sda1 /dev/sdb1
  3. 停止 RAID 阵列mdadm --stop /dev/md/test
  4. 删除 RAID 阵列mdadm --zero-superblock /dev/sda1 /dev/sdb1
  5. 检查所有已组合的 RAID 阵列的状态cat /proc/mdstat

功能说明

mdadm –create

上面的创建命令除了 -create 参数自身和设备名之外,还包括了四个参数:

1、–homehost

默认情况下,mdadm 将你的计算机名保存为 RAID 阵列的属性。如果你的计算机名与存储的名称不匹配,则阵列将不会自动组合。此功能在共享硬盘的服务器群集中很有用,因为如果多个服务器同时尝试访问同一驱动器,通常会发生文件系统损坏。名称 any 是保留字段,并禁用 -homehost 限制。

2、 –metadata

-mdadm 保留每个 RAID 设备的一小部分空间,以存储有关 RAID 阵列本身的信息。 -metadata 参数指定信息的格式和位置。1.0 表示使用版本 1 格式,并将元数据存储在设备的末尾。

3、–level

-level 参数指定数据应如何在底层设备之间分布。级别 1 表示每个设备应包含所有数据的完整副本。此级别也称为磁盘镜像

4、–raid-devices

-raid-devices 参数指定将用于创建 RAID 阵列的设备数。

通过将 -level=1(镜像)与 -metadata=1.0 (将元数据存储在设备末尾)结合使用,可以创建一个 RAID1 阵列,如果不通过 mdadm 驱动访问,那么它的底层设备会正常显示。这在灾难恢复的情况下很有用,因为即使新系统不支持 mdadm 阵列,你也可以访问该设备。如果程序需要在 mdadm 可用之前以只读访问底层设备时也很有用。例如,计算机中的 UEFI 固件可能需要在启动 mdadm 之前从 ESP 读取引导加载程序。

mdadm –assemble

如果成员设备丢失或损坏,上面的组合命令将会失败。要强制 RAID 阵列在其中一个成员丢失时进行组合并启动,请使用以下命令:

# mdadm --assemble --run /dev/md/test /dev/sda1

其他重要说明

避免直接写入底层是 RAID1 的设备。这导致设备不同步,并且 mdadm 不会知道它们不同步。如果你访问了在其他地方被修改了设备的某个 RAID1 阵列,则可能导致文件系统损坏。如果你在其他地方修改 RAID1 设备并需要强制阵列重新同步,请从要覆盖的设备中删除 mdadm 元数据,然后将其重新添加到阵列,如下所示:

# mdadm --zero-superblock /dev/sdb1
# mdadm --assemble --run /dev/md/test /dev/sda1
# mdadm /dev/md/test --add /dev/sdb1

以上用 sda1 的内容完全覆盖 sdb1 的内容。

要指定在计算机启动时自动激活的 RAID 阵列,请创建 /etc/mdadm.conf 配置。

有关最新和详细信息,请查看手册页:

$ man mdadm
$ man mdadm.conf

本系列的下一篇文章将展示如何将现有的单磁盘 Linux 系统变为镜像磁盘安装,这意味着即使其中一个硬盘突然停止工作,系统仍将继续运行!


via: https://fedoramagazine.org/managing-raid-arrays-with-mdadm/

作者:Gregory Bartholomew 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出