我需要一种方法来列出 zsh 中别名、函数、变量、数组的名称(不包括正文/内容/值)。最好它应该表现得像compgen:
compgen -a # will list all the aliases you could run.
compgen -A function # will list all the functions you could run.
compgen -A variable # will list all the variables defined.
Run Code Online (Sandbox Code Playgroud)
背景
我需要这个来开发 env_parallel.zsh:https ://www.gnu.org/software/parallel/env_parallel.html
我在不同的 GNU/Linux 安装上对此进行了测试:
perl -e 'while(1){open($a{$b++}, "<" ,"/dev/null") or die $b;print " $b"}'
Run Code Online (Sandbox Code Playgroud)
系统 A 和 D
我遇到的第一个限制是 1024。通过将其放入 /etc/security/limits.conf 可以轻松提高:
* hard nofile 1048576
Run Code Online (Sandbox Code Playgroud)
然后运行:
ulimit -n 1048576
echo 99999999 | sudo tee /proc/sys/fs/file-max
Run Code Online (Sandbox Code Playgroud)
现在测试转到 1048576。
但是,似乎我无法将其提高到 1048576 以上。如果我将 1048577 放在limits.conf 中,它就会被忽略。
这是什么原因造成的?
系统B
在系统 BI 上甚至无法到达 1048576:
echo 99999999 | sudo tee /proc/sys/fs/file-max
Run Code Online (Sandbox Code Playgroud)
/etc/security/limits.conf:
* hard nofile 1048576
Run Code Online (Sandbox Code Playgroud)
在这里我得到:
$ ulimit -n 65537
bash: ulimit: open files: cannot modify limit: Operation not permitted
$ ulimit -n 65536
#OK …Run Code Online (Sandbox Code Playgroud) 在 3 台机器上,我得到:
$ speedtest-cli
Retrieving speedtest.net configuration...
Traceback (most recent call last):
File "/usr/bin/speedtest-cli", line 11, in <module>
load_entry_point('speedtest-cli==2.1.2', 'console_scripts', 'speedtest-cli')()
File "/usr/lib/python3/dist-packages/speedtest.py", line 1986, in main
shell()
File "/usr/lib/python3/dist-packages/speedtest.py", line 1872, in shell
speedtest = Speedtest(
File "/usr/lib/python3/dist-packages/speedtest.py", line 1091, in __init__
self.get_config()
File "/usr/lib/python3/dist-packages/speedtest.py", line 1173, in get_config
ignore_servers = list(
ValueError: invalid literal for int() with base 10: ''
Run Code Online (Sandbox Code Playgroud)
我已经在两个不同的互联网连接上测试了其中一台机器,结果相同。
为什么它不起作用?
time 如果您想弄清楚给定命令需要多少 CPU 时间,这是一个很棒的命令。
我正在寻找类似的东西,可以测量程序和任何子项的磁盘 I/O。它最好区分缓存的 I/O(因此不会导致磁盘旋转)和未缓存的 I/O。
所以我想做:
iomeassure my_program my_args
Run Code Online (Sandbox Code Playgroud)
并获得类似于以下内容的输出:
Cached read: 10233303 Bytes
Cached write: 33303 Bytes # This was probably a tmp file that was erased before making it to the disk
Non-cached read: 200002020 Bytes
Non-cached write: 202020 Bytes
Run Code Online (Sandbox Code Playgroud)
我看过vmstat, iostat, 和sar,但这些都不是在看一个过程。相反,他们着眼于整个系统。
我已经看过了iotop,但这只能让我看到这一瞬间。
- - 编辑 - -
snap的答案似乎很接近。
“文件系统输入:”是 512 字节块中的非缓存读取。
“文件系统输出:”是 512 字节块中的缓存写入。
您可以使用以下命令强制清空缓存:
sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null
Run Code Online (Sandbox Code Playgroud)
我测试了:
seq …Run Code Online (Sandbox Code Playgroud) GNU/Linux 具有覆盖目录的联合挂载。因此,您可以在只读目录之上安装可写目录。当可写目录被卸载时,只读目录保持不变。
我正在为块设备寻找相同的功能 - 最好将可写部分存储在文件中。所以我想运行类似的东西:
device-setup /dev/newdevice /dev/read-only-device overlayfile
Run Code Online (Sandbox Code Playgroud)
如果我写入 /dev/newdevice 更改应该存储在覆盖文件中。如果我读取写入的扇区,我应该从覆盖文件中获取数据。如果我读取未写入的扇区,我应该从 /dev/read-only-device 获取数据。
有这样的工具吗?
我有一个包含数十亿行可变长度的大排序文件。给定一个新行,我想知道如果它已包含在排序文件中,它将获得哪个字节数。
例子
a\n
c\n
d\n
f\n
g\n
Run Code Online (Sandbox Code Playgroud)
给定输入 'foo' 我会得到输出 9。
这很容易通过简单地遍历整个文件来完成,但是由于数十亿行的可变长度,进行二分搜索会更快。
这样的文本处理工具是否已经存在?
编辑:
现在可以了:https : //gitlab.com/ole.tange/tangetools/blob/master/2search
我有一个很大的 .gz 文件。我想将其拆分为 100 个较小的 gzip 文件,每个文件都可以自行解压缩。换句话说:我不是在寻找一种将 .gz 文件切成块的方法,这些块必须重新组合在一起才能解压缩。我希望能够独立解压缩每个较小的文件。
可以在不重新压缩整个文件的情况下完成吗?
原文件压缩后可以--rsyncable吗?(“通过定期重置压缩数据流的内部结构,更好地满足 rsync 程序的需求。”听起来这些重置点可能是拆分的好地方,并且可能会预先添加一个标头。)
可以为任何其他压缩格式完成吗?我想bzip2是可行的 - 因为它是按块压缩的。
我的软件 RAID6 的 I/O 经常冻结大约 30 秒,之后一切都恢复正常。
冻结结束后,将其放入系统日志:
Mar 14 18:43:57 server kernel: [35649.816060] sd 5:0:23:0: [sdy] CDB: Read(10): 28 00 6c 52 68 58 00 04 00 00
Mar 14 18:43:58 server kernel: [35651.149020] mptbase: ioc0: LogInfo(0x31140000): Originator={PL}, Code={IO Executed}, SubCode(0x0000) cb_idx mptscsih_io_done
Mar 14 18:43:58 server kernel: [35651.151962] mptscsih: ioc0: task abort: SUCCESS (rv=2002) (sc=ffff8807b02dfe80)
Mar 14 18:43:58 server kernel: [35651.151967] mptscsih: ioc0: attempting task abort! (sc=ffff88002a7f30c0)
Mar 14 18:43:58 server kernel: [35651.151972] sd 5:0:23:0: [sdy] CDB: Read(10): …Run Code Online (Sandbox Code Playgroud) 我有百万4-20 KB文件的目录(可以产生类似的这样的文件:seq 10000 | gzip > a; seq 1000000 | parallel --bar 'head -c{=$_=int(rand()*16)+4=}k a > {}')
. 我需要复制那个目录。但似乎我必须为每个文件做一个搜索,所以这需要很长时间。
有什么方法可以加快速度吗?
我目前在想,如果我能得到这些文件占用的磁盘块,我可以对它们进行排序,合并接近的块(鉴于顺序读取通常比寻找更快)并读取这些块,以便它们在 RAM 中在进行复制之前缓存(我有 32 GB RAM)。
但是为了让它工作,我需要一种方法来识别文件所在的块。
我在磁性设备(即不是 SSD)上使用 EXT4。
编辑:
这应该有效,但它没有:
ls |
parallel -IOO --pipe "sudo parallel -j100 hdparm --fibmap {}'|tail -n +5'" |
sort -nk 2 |
perl -ane 'if($u+10000 < $F[1]) { print "$l ",($u-$l),"\n"; $l=$F[1] } $u=$F[2]' |
sudo parallel --colsep ' ' dd if=/dev/sda1 skip={1} bs=512 count={2} '| cat >/dev/null'
Run Code Online (Sandbox Code Playgroud)
在大文件上测试时,它不会缓存文件。
编辑2: …
即使有可用的交换,我的服务器也耗尽了内存。
为什么?
我可以这样重现它:
eat_20GB_RAM() {
perl -e '$a="c"x10000000000;print "OK\n";sleep 10000';
}
export -f eat_20GB_RAM
parallel -j0 eat_20GB_RAM ::: {1..25} &
Run Code Online (Sandbox Code Playgroud)
当稳定(即所有进程都进入睡眠状态)时,我再运行一些:
parallel --delay 5 -j0 eat_20GB_RAM ::: {1..25} &
Run Code Online (Sandbox Code Playgroud)
当稳定(即所有进程都进入睡眠状态)时,使用大约 800 GB RAM/swap:
$ free -m
total used free shared buff/cache available
Mem: 515966 440676 74514 1 775 73392
Swap: 1256720 341124 915596
Run Code Online (Sandbox Code Playgroud)
当我再运行一些时:
parallel --delay 15 -j0 eat_20GB_RAM ::: {1..50} &
Run Code Online (Sandbox Code Playgroud)
我开始得到:
Out of memory!
Run Code Online (Sandbox Code Playgroud)
即使有明显的交换可用。
$ free
total used free shared buff/cache available
Mem: 528349276 518336524 7675784 14128 …Run Code Online (Sandbox Code Playgroud)