在进行一些基准测试工作之前,如何释放 Linux 内核为其缓冲区和缓存消耗的内存 (RAM)?
请注意,这主要用于基准测试。清空缓冲区和缓存会降低性能!如果你在这里是因为你认为释放缓冲区和缓存是一件好事,那就去读一读Linux 吃了我的 RAM!. 简短的故事:空闲内存是未使用的内存是浪费的内存。
使用交换空间而不是 RAM 会大大降低PC 的速度。
那么为什么当我有足够多的可用 RAM 时,我的 Linux 系统 (Arch) 会使用交换区吗?
在下面查看我的 conky 输出:

另外,这可能是我遇到的速度和系统响应问题的原因吗?
的输出free -m:
$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357
Run Code Online (Sandbox Code Playgroud) 我既不担心 RAM 使用情况(因为我已经足够了),也不担心在意外关闭的情况下丢失数据(因为我的电源有保障,系统是可靠的,数据并不重要)。但是我做了很多文件处理并且可以使用一些性能提升。
这就是为什么我想将系统设置为使用更多 RAM 进行文件系统读写缓存,积极预取文件(例如,预读应用程序访问的整个文件,以防文件大小合理或至少否则,请提前读取其中的一大块)并减少刷新写入缓冲区的频率。如何实现这一目标(可能)?
我在 XUbuntu 11.10 x86 上使用 ext3 和 ntfs(我经常使用 ntfs!)文件系统。
有时我会在网上看到“确保你设置 'bs=' 因为默认值会花费太长时间”的评论,以及我自己非常不科学的经验,“这似乎比其他人花费的时间更长上周时间”似乎证明了这一点。因此,每当我使用“dd”(通常在 1-2GB 范围内)时,我都会确保指定 bytes 参数。大约有一半的时间我使用我从中复制的任何在线指南中指定的值;剩下的时间我会从'fdisk -l'列表中选择一些有意义的数字,我认为是较慢的媒体(例如我正在写入的SD卡)。
对于给定的情况(媒体类型、总线大小或其他重要事项),有没有办法确定“最佳”值?容易确定吗?如果没有,是否有一种简单的方法可以达到 90-95%?或者“只选择大于 512 的东西”甚至是正确答案?
我想过自己尝试这个实验,但是(除了工作量很大)我不确定哪些因素会影响答案,所以我不知道如何设计一个好的实验。
我一直认为使用 dash 而不是 bash 的唯一好处是 dash 更小,因此许多 dash 实例在启动时启动得更快。
但是我做了一些研究,发现有些人将他们所有的脚本迁移到 dash 中,希望他们能跑得更快,我也在Ubuntu Wiki 的DashAsBinSh文章中发现了这一点:
切换默认 shell 的主要原因是效率。bash 是一个优秀的全功能 shell,适合交互式使用;事实上,它仍然是默认的登录 shell。但是,与dash相比,它的启动和操作相当大且缓慢。
现在,我一直在系统上使用大量 bash 脚本来处理许多事情,我的问题是我有一个特定的脚本,我 24/7 连续运行,产生大约 200 个孩子,它们一起加热我的计算机 10° C多于正常使用。
这是一个相当大的脚本,有很多 bashism,因此将它们移植到 POSIX 或其他一些 shell 将非常耗时(而且 POSIX 对个人使用并不重要),但如果我能减少其中的一些,那将是值得的CPU使用率。我知道还有其他事情需要考虑,比如调用一个外部二进制文件,比如sed一个简单的 bashism ${foo/bar},或者grep代替=~.
TL;DR与 dash 相比,bash 的启动和运行速度真的更慢吗?是否有其他 Unix shell比 bash更有效?
是否有一个图表,显示了如何如各种性能的工具ip,netstat,perf,top,ps,等与Linux内核中的各个子系统之间的相互作用?
例如在 php-fpm 上:
#listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php-fpm.sock
Run Code Online (Sandbox Code Playgroud)
在 TCP 端口上使用基于 unix 套接字的侦听器之间有什么主要的性能差异吗?(不仅适用于 PHP,而且适用于一般情况。每个服务是否不同?)
许多命令行实用程序可以从管道或文件名参数中获取输入。对于长 shell 脚本,我发现以 a 开头的链cat使其更具可读性,尤其是在第一个命令需要多行参数的情况下。
相比
sed s/bla/blaha/ data \
| grep blah \
| grep -n babla
Run Code Online (Sandbox Code Playgroud)
和
cat data \
| sed s/bla/blaha/ \
| grep blah \
| grep -n babla
Run Code Online (Sandbox Code Playgroud)
后一种方法效率较低吗?如果是这样,差异是否足以关心脚本是否每秒运行一次?可读性的差异并不大。
我有一个包含许多小文件和少量大文件的目录树。文件的平均大小约为 1 KB。树中有 210158 个文件和目录(这个数字是通过运行获得的find | wc -l)。
每周几次添加/删除/重写一小部分文件。这适用于小文件以及(少量)较大文件。
我尝试过的文件系统(ext4、btrfs)在磁盘文件定位方面存在一些问题。随着时间的推移,文件在磁盘(旋转介质,而不是固态磁盘)上的物理位置变得更加随机分布。这种随机分布的负面结果是文件系统变得越来越慢(例如:比新文件系统慢 4 倍)。
是否有一种 Linux 文件系统(或一种文件系统维护方法)不会受到这种性能下降的影响并且能够在旋转媒体上保持稳定的性能配置文件?文件系统可以在 Fuse 上运行,但它需要可靠。
我使用grep -i得更频繁,我发现它比egrep等效的慢,我匹配每个字母的大写或小写:
$ time grep -iq "thats" testfile
real    0m0.041s
user    0m0.038s
sys     0m0.003s
$ time egrep -q "[tT][hH][aA][tT][sS]" testfile
real    0m0.010s
user    0m0.003s
sys     0m0.006s
Run Code Online (Sandbox Code Playgroud)
是否grep -i做额外的测试,egrep不?