我在XUbuntu 11.10 x86中使用ext3和ntfs(我经常使用ntfs!)文件系统。
#1 楼
通常,提高磁盘缓存性能不只是增加文件系统缓存大小,除非整个系统都适合RAM,在这种情况下,您应该使用RAM驱动器(tmpfs
很好,因为在某些情况下,如果需要RAM,它可以退回到磁盘)用于运行时存储(可能还有一个initrd脚本,用于在启动时将系统从存储复制到RAM驱动器)。这是我发现对我有用的东西(在我的情况下,sda
是安装在/home
上的硬盘驱动器,而sdb
是安装在/
上的SSD)。 -cache部分:这是我的HDD设置(如果有切换,请确保在BIOS中启用AHCI + NCQ):
echo cfq > /sys/block/sda/queue/scheduler
echo 10000 > /sys/block/sda/queue/iosched/fifo_expire_async
echo 250 > /sys/block/sda/queue/iosched/fifo_expire_sync
echo 80 > /sys/block/sda/queue/iosched/slice_async
echo 1 > /sys/block/sda/queue/iosched/low_latency
echo 6 > /sys/block/sda/queue/iosched/quantum
echo 5 > /sys/block/sda/queue/iosched/slice_async_rq
echo 3 > /sys/block/sda/queue/iosched/slice_idle
echo 100 > /sys/block/sda/queue/iosched/slice_sync
hdparm -q -M 254 /dev/sda
对于HDD情况,值得注意的是
fifo_expire_async
(通常为写入)较高且slice_sync
较长,以允许单个进程获得高吞吐量(如果遇到多个进程正在并行等待磁盘中的某些数据的情况,请将slice_sync
设置为较小的数字)。 slice_idle
始终是HDD的一个折衷方案,但根据磁盘使用情况和磁盘固件,将其设置在3-20范围内应该可以。我更喜欢将目标值设置为较低,但将其设置得太低则会破坏您的吞吐量。 quantum
设置似乎对吞吐量有很大影响,但请尝试将其保持在尽可能低的水平,以将延迟保持在合理的水平。将quantum
设置得太低会破坏吞吐量。 3-8范围内的值似乎可以很好地与HDD配合使用。如果我已正确理解内核行为,则读取的最坏情况延迟是(quantum
* slice_sync
)+(slice_async_rq
* slice_async
)ms。异步通常由写入操作使用,并且由于您愿意延迟写入磁盘,因此请将slice_async_rq
和slice_async
都设置为非常低的数字。但是,将slice_async_rq
的值设置得太低可能会导致读取停止,因为读取后无法再延迟写入。我的配置将在数据传递到内核后最多10秒后尝试将数据最多写入磁盘,但是由于您可以忍受掉电造成的数据丢失,因此请将fifo_expire_async
设置为3600000
可以告诉您,磁盘延迟时间为1小时是可以的。但是,只需将slice_async
保持在较低的水平,否则可能会导致较高的读取延迟。如果您的磁盘发出太多噪音,请跳过此操作。这是我的SSD(Intel 320系列)设置:
echo cfq > /sys/block/sdb/queue/scheduler
echo 1 > /sys/block/sdb/queue/iosched/back_seek_penalty
echo 10000 > /sys/block/sdb/queue/iosched/fifo_expire_async
echo 20 > /sys/block/sdb/queue/iosched/fifo_expire_sync
echo 1 > /sys/block/sdb/queue/iosched/low_latency
echo 6 > /sys/block/sdb/queue/iosched/quantum
echo 2 > /sys/block/sdb/queue/iosched/slice_async
echo 10 > /sys/block/sdb/queue/iosched/slice_async_rq
echo 1 > /sys/block/sdb/queue/iosched/slice_idle
echo 20 > /sys/block/sdb/queue/iosched/slice_sync
在此值得注意不同切片设置的较低值。 SSD的最重要设置是
hdparm
,必须将其设置为0-1。将其设置为零会将所有排序决定移至本机NCQ,而将其设置为1则允许内核对请求进行排序(但如果NCQ处于活动状态,则硬件可能会部分覆盖内核排序)。测试两个值以查看是否可以看到差异。对于Intel 320系列,似乎将slice_idle
设置为slide_idle
可以提供最佳的吞吐量,但是将其设置为0
则可以提供最佳(最低)的总体延迟。 .kernel.org / doc / Documentation / block / cfq-iosched.txt。2020年更新,内核版本5.3(cfq已死):
modprobe bfq
for d in /sys/block/sd?
do
# HDD (tuned for Seagate SMR drive)
echo bfq > "$d/queue/scheduler"
echo 4 > "$d/queue/nr_requests"
echo 32000 > "$d/queue/iosched/back_seek_max"
echo 3 > "$d/queue/iosched/back_seek_penalty"
echo 80 > "$d/queue/iosched/fifo_expire_sync"
echo 1000 > "$d/queue/iosched/fifo_expire_async"
echo 5300 > "$d/queue/iosched/slice_idle_us"
echo 1 > "$d/queue/iosched/low_latency"
echo 200 > "$d/queue/iosched/timeout_sync"
echo 0 > "$d/queue/iosched/max_budget"
echo 1 > "$d/queue/iosched/strict_guarantees"
# additional tweaks for SSD (tuned for Samsung EVO 850):
if test $(cat "$d/queue/rotational") = "0"
then
echo 36 > "$d/queue/nr_requests"
echo 1 > "$d/queue/iosched/back_seek_penalty"
# slice_idle_us should be ~ 0.7/IOPS in µs
echo 16 > "$d/queue/iosched/slice_idle_us"
echo 10 > "$d/queue/iosched/fifo_expire_sync"
echo 250 > "$d/queue/iosched/fifo_expire_async"
echo 10 > "$d/queue/iosched/timeout_sync"
echo 0 > "$d/queue/iosched/strict_guarantees"
fi
done
设置非常相似,但是我现在使用
1
代替bfq
,因为后者在现代内核中不可用。我尝试将cfq
保持尽可能低,以使nr_requests
可以更准确地控制调度。至少三星SSD驱动器似乎需要相当长的队列才能运行在高IOPS上。 我现在也使用
bfq
,但是我只将5%的RAM用于zram。这使Linux内核可以使用交换相关的逻辑,而无需接触磁盘。但是,如果您决定使用零磁盘交换,请确保您的应用程序不会泄漏RAM或在浪费金钱。性能,是时候调整缓存行为了:根据我做过的基准测试,我根本不会理会通过
linux-lowlatency-hwe-18.04-edge
进行的预读。内核默认设置很好。将系统设置为比应用程序代码更喜欢交换文件数据(如果您有足够的RAM来保持整个文件系统以及所有应用程序代码和应用程序分配的所有虚拟内存在RAM中,这无关紧要)。这样可以减少在不同应用程序之间进行交换的等待时间,而不是用于从单个应用程序访问大文件的等待时间:
设置为1。如果将其设置为零,除非绝对有必要避免OOM,否则内核将根本不会交换。如果您的内存有限并且要处理大文件(例如,高清视频编辑),那么将其设置为接近100可能是有道理的。您有足够的RAM。如果不进行交换,则在长时间运行的台式机上通常会丢失200-1000 MB的RAM。我愿意为此付出很多,以避免最坏情况下的延迟(在RAM满时交换应用程序代码)。实际上,这意味着我更喜欢OOM Killer而不是交换。如果允许/需要交换,则可能也想增加
bfq
以避免某些延迟。我建议使用介于100和500之间的值。您可以将此设置视为交易CPU使用率,以降低交换延迟。默认值是10,最大可能值是1000。更高的值(根据内核文档)应导致zram
进程的CPU使用率更高,并且总体交换延迟较低。 接下来,告诉内核优先于在文件中保留目录层次结构而不是文件内容,以防万一需要释放一些RAM(同样,如果所有内容都适合RAM,则此设置不起作用): br />
echo 15 > /proc/sys/vm/swappiness
将
blockdev
设置为较低的值很有意义,因为在大多数情况下,内核需要先了解目录结构,然后才能使用高速缓存中的文件内容,并且过早刷新目录高速缓存将使文件高速缓存几乎一文不值。如果您有很多小文件(我的系统大约有150K 10兆像素的照片,算作“很多小文件”系统),请考虑使用此设置将其降至1。永远不要将其设置为零,否则即使系统内存不足,目录结构也始终保留在内存中。仅当您只需要不断读取少量大文件时,才将此值设置为大值才有意义(同样,没有足够RAM的高清视频编辑就是一个例子)。官方内核文档说:“将vfs_cache_pressure显着增加到超过100可能会对性能造成负面影响。”高于100可能是明智的。仅当您没有足够的RAM并且无法将整个目录结构保留在RAM中并且仍然有足够的RAM用于常规文件缓存和进程时(例如,具有大量存档内容的公司范围的文件服务器),这才适用。如果您认为需要将/proc/sys/vm/watermark_scale_factor
增加到100以上,则说明您的RAM不足。增加kswapd
可能会有所帮助,但唯一的解决办法是获得更多的RAM。将vfs_cache_pressure
设置为高数值会牺牲总体性能,因为它们总体上具有更稳定的性能(也就是说,您可以避免非常糟糕的最坏情况下的行为,但必须处理更差的总体性能)。将多达99%的RAM用作写缓存,并指示内核在减慢正在写入的进程之前使用多达50%的RAM(vfs_cache_pressure
的默认值为vfs_cache_pressure
)。警告:我个人不会这样做,但是您声称有足够的RAM并愿意丢失数据。告诉1h的写延迟就可以开始在磁盘上写东西(同样,我不会这样做):
echo 10 > /proc/sys/vm/vfs_cache_pressure
有关这些可调参数的信息,请参见https://www.kernel.org/doc/Documentation/sysctl/vm.txt 如果将所有这些都放在
vfs_cache_pressure
上并在末尾加上以下内容,则将引导后尽快进入缓存(仅在文件系统确实适合RAM时才这样做):仅
vfs_cache_pressure
和dirty_background_ratio
,仅当您的10
和/etc/rc.local
确实适合RAM时才这样做):echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio
评论
消息灵通且总体上比接受的答案好得多!这个被低估了...我想大多数人只是想要简单的说明而无需理会他们的实际工作...
–弗拉基米尔·潘捷列夫(Vladimir Panteleev)
13年1月26日在18:17
@Phpdevpad:另外,问题说:“我也不关心RAM的使用情况。”-我认为任何Maemo设备都不符合要求。
– Mikko Rantalainen
13年1月28日在7:11
Noop或截止日期不是更好的SSD调度程序吗?
–rep_movsd
13年8月14日在7:58
@rep_movsd我一直只使用intel SSD驱动器,但是至少这些驱动器仍然足够慢,无法通过更智能的调度程序(例如CFQ)获得更好的整体性能。我猜想,如果您的SSD驱动器可以处理超过100K的随机IOPS,则即使在CPU速度较快的情况下,使用noop还是使用截止时间也是有意义的。所谓“快速CPU”,是指至少有多个3GHz内核仅可用于IO。
– Mikko Rantalainen
13年8月15日在8:58
您还可以从vm内核文档中了解有关这些vm可调参数的信息。
– joeytwiddle
18年10月10日在2:48
#2 楼
首先,我不建议您继续使用NTFS,因为在Linux中ntfs的实现随时都会带来性能和安全问题。您可以执行以下几项操作:
使用一些新的fs,例如
ext4
或btrfs
尝试更改io调度程序,例如
bfq
关闭swap
使用一些自动预载像
preload
在引导时使用类似
systemd
的东西预加载...以及更多
也许您想尝试一下:-)
评论
我已经完全从NTFS移至ext4,仅将NTFS分区保留为Windows系统分区。但这给我带来了许多不便,我又将NTFS用作主数据分区(我在其中存储所有文档,下载,项目,源代码等)的文件系统。我不放弃重新考虑分区结构和工作流程(以使用更少的Windows),但是现在放弃NTFS似乎不是一个现实的选择。
–伊凡
2012年2月3日,12:39
如果您也必须在Windows内部使用数据,则NTFS可能是唯一的选择。 (如果您可以将Windows用作Linux中的VM,则可以使用许多其他选项)
–费利克斯·严(Felix Yan)
2012年2月3日,12:41
总结一下NTFS这些所谓的问题是很有用的。
– underscore_d
2015年10月5日在22:40
除了性能外,Linux上的NTFS几乎可以接受。考虑到该问题专门用于提高文件系统性能,因此NTFS应该是第一件事。
– Mikko Rantalainen
18年4月12日在12:51
即使btrfs是最近设计的文件系统,但如果需要性能,我也会避免这样做。我们一直在运行具有btrfs和ext4文件系统的相同系统,而ext4在现实世界中以较大的优势获胜(btrfs似乎需要大约4倍的CPU时间,而ext4才能达到相同的性能水平,并且单个逻辑会导致更多磁盘操作命令)。根据工作量,我建议使用ext4,jfs或xfs进行任何性能要求很高的工作。
– Mikko Rantalainen
18年5月15日在6:00
#3 楼
预读:在32位系统上:
blockdev --setra 8388607 /dev/sda
在64位系统上:
blockdev --setra 4294967295 /dev/sda
在高速缓存后面写:
echo 100 > /proc/sys/vm/dirty_ratio
这将占用您100%的可用内存作为写高速缓存。
或您可以全力以赴并使用tmpfs。仅在您有足够的RAM时才有意义。把它放在
/etc/fstab
中。用物理RAM量替换100G。tmpfs /mnt/tmpfs tmpfs size=100G,rw,nosuid,nodev 0 0
然后:
mkdir /mnt/tmpfs; mount -a
然后使用/ mnt / tmpfs。
评论
预读3GB或2TB?真?您甚至不知道这些选项会做什么?
–Cobra_Fast
2013年12月25日下午4:11
@Cobra_Fast你知道这意味着什么吗?我真的不知道,我现在很感兴趣。
–syss
2015年6月15日19:22
@syss预读设置将保存为内存“块”数,而不是字节或位。在某些情况下,一个块的大小是在内核编译时(因为预读块是内存块)或文件系统创建时确定。不过,通常情况下,1个块包含512或4096字节。参见linux.die.net/man/8/blockdev
–Cobra_Fast
2015年6月15日在22:32
#4 楼
您可以使用blockdev --setra sectors /dev/sda1
设置预读大小,其中扇区是您想要的512字节扇区大小。#5 楼
我的杀手设置非常简单而且非常有效:echo "2000" > /proc/sys/vm/vfs_cache_pressure
内核文档中的解释:
vfs_cache_pressure
控制内核趋向于回收用于缓存目录和inode对象的内存。
默认值为vfs_cache_pressure = 100时,内核将尝试
以相对于
页面缓存和swapcache回收的“合理”速率回收牙科和索引节点。减少vfs_cache_pressure会导致内核更喜欢保留dentry和inode缓存。当
vfs_cache_pressure = 0时,内核将永远不会由于内存压力而回收内存和
索引节点,这很容易导致内存不足的情况。将vfs_cache_pressure增加到100以上会导致内核更喜欢回收牙科和索引节点。
vfs_cache_pressure
在2000年导致大多数计算发生在RAM中,并且非常晚磁盘写入。评论
将vfs_cache_pressure设置得太高(我认为2000太高)将导致不必要的磁盘访问,即使对于简单的东西(例如目录列表)也应该很适合缓存。您拥有多少RAM,并且系统正在做什么?正如我在回答中所写的那样,对于此设置使用高值是有意义的,例如有限的RAM进行高清视频编辑。
– Mikko Rantalainen
2014年9月30日上午10:51
请注意,参考文档仍在继续:“将vfs_cache_pressure大幅增加到100以上可能会对性能造成负面影响。回收代码需要采取各种锁定措施才能找到可释放的目录和inode对象。使用vfs_cache_pressure = 1000时,它将查找的可释放对象比此处多十倍是。”
– Mikko Rantalainen
18年3月14日在7:02
#6 楼
与写入缓存无关,但与写入有关:对于ext4系统,您可以完全禁用日记功能
这将减少数量任何特定更新的磁盘写入次数,但在意外关闭后可能会导致文件系统处于不一致状态,这需要fsck或更严重的操作。 br />
使用relatime或noatime选项进行安装
读取文件时,通常会更新该文件的“上次访问时间”元数据。
noatime
选项将禁用该行为。这样可以减少不必要的磁盘写入,但是您将不再拥有该元数据。某些发行版本(例如Manjaro)已将其作为所有分区的默认设置(可能是为了延长早期型号SSD的寿命)。确实使用atime的应用程序。这是Red Hat Enterprise Linux上的默认设置。其他选项:
在上面的评论中,Mikko分享了与nobarrier选项。但是Ivailo引用RedHat的警告。您多么想要那额外的3%?
评论
如果您有大量的RAM,请非常在意性能,而不在乎数据丢失,只需将所有数据复制到RAM磁盘上并从那里进行处理,就可以在崩溃/关机时丢弃所有更新。如果这对您不起作用,则可能需要使“足够”的RAM合格,或者数据不那么重要。@Nils,计算机是一台笔记本电脑,所以,我相信控制器非常普通。
大量提高性能的一种方法是跳过数据的持久性。即使某些应用程序要求同步,也只需禁用与磁盘的同步即可。如果您的存储设备断电,这将导致数据丢失。如果仍然要执行此操作,只需执行sudo mount -o ro,nobarrier / path / to / mountpoint或调整/ etc / fstab以为您愿意为提高性能而牺牲的任何文件系统包括nobarrier。但是,如果您的存储设备具有内置电池(例如Intel 320 SSD系列),则使用nobarrier不会导致数据丢失。
在Red Hat Enterprise Linux 6中不再建议使用nobarrier,因为写障碍对性能的负面影响可以忽略不计(大约3%)。写屏障的好处通常超过禁用它们的性能好处。此外,绝对不要在虚拟机上配置的存储上使用nobarrier选项。 access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux / ...
有两点-1)有一些基于Debian或Ubuntu的Linux发行版,例如Puppy Linux和AntiX Linux,还有许多其他发行版将整个操作系统放在分层的ramdisk分区中(即AUFS或overlayfs)并透明地进行管理。非常快! -2)我们在大型系统的实际设计中发现,向其扔更多的缓存会降低性能。随着存储速度的增加(即SSD),所需的最佳缓存大小会减小。但是,如果不对您的特定系统进行实验,就无法知道该大小是多少。如果增加无效,请尝试减小。