我既不用担心RAM的使用(我已经足够了),也不必担心由于意外关机而丢失数据(因为支持我的电源,系统可靠并且数据不是关键)。但是我做了很多文件处理工作,并且可以使用一些性能提升功能。 (例如,预读应用程序访问的整个文件,以防文件大小正常,否则至少预读很大一部分),并减少刷新缓冲区的频率。如何实现(可能)?

我在XUbuntu 11.10 x86中使用ext3和ntfs(我经常使用ntfs!)文件系统。

评论

如果您有大量的RAM,请非常在意性能,而不在乎数据丢失,只需将所有数据复制到RAM磁盘上并从那里进行处理,就可以在崩溃/关机时丢弃所有更新。如果这对您不起作用,则可能需要使“足够”的RAM合格,或者数据不那么重要。

@Nils,计算机是一台笔记本电脑,所以,我相信控制器非常普通。

大量提高性能的一种方法是跳过数据的持久性。即使某些应用程序要求同步,也只需禁用与磁盘的同步即可。如果您的存储设备断电,这将导致数据丢失。如果仍然要执行此操作,只需执行sudo mount -o ro,nobarrier / path / to / mountpoint或调整/ etc / fstab以为您愿意为提高性能而牺牲的任何文件系统包括nobarrier。但是,如果您的存储设备具有内置电池(例如Intel 320 SSD系列),则使用no​​barrier不会导致数据丢失。

在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),所需的最佳缓存大小会减小。但是,如果不对您的特定系统进行实验,就无法知道该大小是多少。如果增加无效,请尝试减小。

#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_rqslice_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_pressuredirty_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,例如ext4btrfs

尝试更改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%?