我正在调查一个问题,即加密块设备会在写入时造成巨大的性能损失。数小时的互联网阅读和实验并没有让我得到正确的理解,更不用说解决方案了。
简而言之:为什么将 btrfs 放到块设备上时我的写入速度非常快(~170MB/s),而将 dm-crypt/LUKS 放在块设备之间时写入速度会下降(~20MB/s)文件系统和块设备,尽管系统能够维持足够高的加密吞吐量?
/home/schlimmchen/random是一个 4.0GB 的文件,里面装满了之前的数据/dev/urandom。
dd if=/dev/urandom of=/home/schlimmchen/Documents/random bs=1M count=4096
Run Code Online (Sandbox Code Playgroud)
阅读速度超快:
$ dd if=/home/schlimmchen/Documents/random of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 6.58036 s, 648 MB/s
$ dd if=/home/schlimmchen/Documents/random of=/dev/null bs=1M
4265841146 bytes (4.3 GB) copied, 0.786102 s, 5.4 GB/s
Run Code Online (Sandbox Code Playgroud)
(第二次,文件显然是从缓存中读取的)。
设备直接用btrfs格式化(块设备上没有分区表)。
$ sudo mkfs.btrfs /dev/sdf
$ sudo mount /dev/sdf /mnt
$ sudo chmod 777 /mnt
Run Code Online (Sandbox Code Playgroud)
写入速度高达 ~170MB/s:
$ dd if=/home/schlimmchen/Documents/random of=/mnt/dd-test1 bs=1M conv=fsync
4265841146 bytes …Run Code Online (Sandbox Code Playgroud) 我正在执行time一些命令。现在为了平均测量值,我想按照指定的次数运行和计时我的命令,并获得具有计算平均值和标准偏差的结果。结果是这样的:
avgtime -n 100 my_command
real 0m5.388s stdev 0m0.068s
user 0m5.380s stdev 0m0.067s
sys 0m0.004s stdev 0m0.000s
Run Code Online (Sandbox Code Playgroud)
是否有用于此的 UNIX 工具?GNU/Linux 有吗?
要捕获特定模式,awk并且grep可以使用。为什么我们应该使用一个?哪个更快,为什么?
如果我有一个日志文件并且我想获取某个模式,我可以执行以下操作之一
awk '/pattern/' /var/log/messages
Run Code Online (Sandbox Code Playgroud)
或者
grep 'pattern' /var/log/messages
Run Code Online (Sandbox Code Playgroud)
我没有做过任何基准测试,所以我不知道。有人可以详细说明吗?很高兴了解这两个工具的内部工作原理。
Given a string composed of 0s and 1s, my goal is to replace 0 by 1 and vice-versa. Example:
Input
111111100000000000000
Run Code Online (Sandbox Code Playgroud)
Intended output
000000011111111111111
Run Code Online (Sandbox Code Playgroud)
I tried, unsuccessfully, the following sed command
echo '111111100000000000000' | sed -e 's/0/1/g ; s/1/0/g'
000000000000000000000
Run Code Online (Sandbox Code Playgroud)
What am I missing?
我有一个 100 M 行的文件,它适合 GNU/Linux 系统上的 RAM。
这是相当慢的:
sort bigfile > bigfile.sorted
Run Code Online (Sandbox Code Playgroud)
并且没有在我的机器上使用所有 48 个内核。
如何快速对该文件进行排序?
我一直在尝试使用rsnapshot进行备份,但我发现它无法使用。虽然它能够在几分钟内区分一个目录 (50gb) 并复制它(硬链接每个文件),我可以在大约半小时内 cp 整个目录,但删除它需要一个多小时。即使直接使用rm -rfv,我发现 rm 单个文件最多可能需要半秒钟,而cp和link命令会立即完成。
为什么 rm 这么慢?有没有更快的方法来递归删除硬链接?复制文件比删除文件花费的时间更少对我来说没有意义。
我正在使用的文件系统是一个外部存储驱动器,通过 USB 连接并键入 fuseblk(我认为这意味着它是 ntfs)。我的电脑运行的是 ubuntu linux。
从顶部输出:
Cpu(s): 3.0%us, 1.5%sy, 0.0%ni, 54.8%id, 40.6%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 8063700k total, 3602416k used, 4461284k free, 557604k buffers
Run Code Online (Sandbox Code Playgroud) 我编写了以下脚本来测试 Python 排序功能的速度:
from sys import stdin, stdout
lines = list(stdin)
lines.sort()
stdout.writelines(lines)
Run Code Online (Sandbox Code Playgroud)
然后,我将其与sort包含 1000 万行的文件上的 coreutils命令进行了比较:
$ time python sort.py <numbers.txt >s1.txt
real 0m16.707s
user 0m16.288s
sys 0m0.420s
$ time sort <numbers.txt >s2.txt
real 0m45.141s
user 2m28.304s
sys 0m0.380s
Run Code Online (Sandbox Code Playgroud)
内置命令使用了所有四个 CPU(Python 只使用了一个),但运行时间大约是其 3 倍!是什么赋予了?
我使用的是 Ubuntu 12.04.5(32 位)、Python 2.7.3 和sort8.13
我有一个新安装的 Ubuntu 服务器,它应该是我们 VM 存储的新备份服务器。该服务器有 4 个网卡,其中 2 个是 10Gbit(实际上是具有最新驱动程序的 intel x540-T2),用于连接到 SAN。我在本地安装了 nfs-share 并比较了速度差异,同时复制了一个包含 ~30 个文件、大约 15 个 vm-images 和相应日志文件的目录。图像大小介于 8 GB 和 600 GB 之间。
使用:
cp -rf /mnt/nfs-share /backup-storage/
Run Code Online (Sandbox Code Playgroud)
bmon 因此显示大约 600 MiB/s。
使用
rsync -av /mnt/nfs-share /backup-storage/
Run Code Online (Sandbox Code Playgroud)
bmon 在前几秒显示一些数据包,暂停大约 30 秒,然后增加到大约 60-75 MiB/s。CPU在60%左右。
我应该/可以更改什么以使用rsync与 相同的性能cp?
或者是shutdown -h now它可以得到的最快的?
我寻找一些 syscall 或类似的东西,它们将允许跳过在关闭之前完成的大量工作(特别是关心正在运行的过程)。
充其量我想要一个与内核相关的解决方案,对init-middleware(如systemd或upstart)一无所知。
与即直接杀死所有服务(如cups/apache/pulseaudio 等)相关的风险......我不在乎......
备注:解决方案应该是软件副。在设备上按下按钮不是我想要的。