
传统的SSD+Linux组合一般推荐Ext2文件系统,主要是考虑到Ext3、Ext4需要额外的记录日志,会缩短SSD使用寿命,而且新出现的TRIM技术在Ext2中有两个缺点:
仅支持离线TRIM,换句话说文件系统必须只读挂载;
需要手动执行hdparm命令或wiper.sh脚本。
Ext4则没有这些限制,允许TRIM后台运行,并且日志记录功能可以手动关闭(没有日志的情况下,文件系统更容易损坏,如突然断电),如果你甘愿冒这样的风险,从而延长SSD使用寿命,值得一试。另外,许多测试中如:Testing EXT4 &Btrfs On A Serial ATA 3.0 SSD,像Btrfs这样为SSD准备的文件系统不如Ext4速度快(用SSD不就为了快么)。
所以,上面安装系统时,选择了Ext4系统,接下来需要关闭日志功能。
首先,系统挂载时无法停用日志功能,所以需要进入刚才的U盘系统,利用root权限执行:
tune2fs -O ^has_journal /dev/sda1
即关闭/dev/sda1上的日志功能。
然后,运行 *** 作系统检测:
e2fsck -f /dev/sda1
不这样,文件系统可能会出错。
最后,重启,进入SSD中的系统,检查是否设置成功:
dmesg | grep EXT4
如果出现:
EXT4-fs (sda1): mounted filesystem without journal
说明设置成功。
原来是:mounted filesystem with ordered data mode
如果需要再次开启日志功能,只要运行tune2fs -O has_journal /dev/sda1即可。
2.开启TRIM功能
TRIM是一种 *** 作系统调度SSD块写入的方式。主要是因为同一个SSD的闪存单元频繁 *** 作会磨损,影响使用寿命,区别于传统的机械硬盘处理删除数据。Linux内核自2.6.33开始支持TRIM。
首先,检查内核版本是否支持TRIM:
uname -a
然后,检查SSD硬盘是否支持TRIM:
hdparm -I /dev/sda
如果显示比如(不同硬件可能不同提示):
* Data Set Management TRIM supported
说明支持。
这两个条件都满足,在/etc/fstab中将:
/dev/sda1 / ext4 defaults 改为:
/dev/sda1 / ext4 discard,defaults 分区、挂载点、已经存在的选项不一定一样。
测试新的fstab文件:
mount -oremount /dev/sda1
然后挂载:
mount
如果显示discard字样,说明成功,如:
/dev/sda1 on / type ext4 (rw,discard)
3.swap空间处理
对于大内存来说swap基本上都是空闲的,除非电脑进入休眠状态,系统会将内存内容转到swap中。有了SSD,开关机都在几秒中,对我来说swap没用,所以上面直接不分配swap空间。
如果分配了也行,空间要小,而且通过设置/proc/sys/vm/swappiness里面的值,来减少swap换出量:
echo 1 >/proc/sys/vm/swappiness
0到100之间,值越大换出量越大。
4.设置noatime
当访问文件时,系统会更新last-access这个文件/目录元数据,设置noatime后可以减少这种 *** 作。
将2步中的:
/dev/sda1 / ext4 discard,defaults 改为:
/dev/sda1 / ext4 noatime,discard,defaults 测试设置成功方法与上面一样。
5.使用noop磁盘调度
通常 *** 作系统调度机械硬盘时会提供一些数据的物理位置,这样有利于机械硬盘优化寻道,但是对SSD没意义,所以采用noop磁盘调度,即简单发送请求,可以提高效率。
可以通过以下命令查看调度方法:
cat /sys/block/sda/queue/scheduler
比如显示:
[noop] deadline cfq
在/etc/rc.local中添加如下语句:
echo noop >/sys/block/sda/queue/scheduler
6.内存分区加速
如果内存够大,可以用ramdisk的方式,将一些经常变化的位置如/tmp放入内存,加快速度,减少对SSD的访问。
依然是加在/etc/fstab中:
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/tmp tmpfs defaults,noatime,mode=1777 0 0
tmpfs /var/log tmpfs defaults,noatime,mode=1777 0 0
更新方法与2相同,记得将浏览器等程序的缓存目录设置到/tmp下。
您好,很高兴为您解答。在现有文件系统下进行优化:
linux内核和各个文件系统采用了几个优化方案来提升磁盘访问速度。但这些优化方案需要在我们的服务器设计中进行配合才能得到充分发挥。
文件系统缓存
linux内核会将大部分空闲内存交给虚拟文件系统,来作为文件缓存,叫做page cache。在内存不足时,这部分内存会采用lru算法进行淘汰。通过free命令查看内存,显示为cached的部分就是文件缓存了。
如何针对性优化:
lru并不是一个优秀淘汰算法,lru最大的优势是普适性好,在各种使用场景下都能起到一定的效果。如果能找到当前使用场景下,文件被访问的统计特征,针 对性的写一个淘汰算法,可以大幅提升文件缓存的命中率。对于http正向代理来说,一个好的淘汰算法可以用1GB内存达到lru算法100GB内存的缓存 效果。如果不打算写一个新的淘汰算法,一般不需要在应用层再搭一个文件cache程序来做缓存。
最小分配:
当文件扩大,需要分配磁盘空间时,大部分文件系统不会仅仅只分配当前需要的磁盘空间,而是会多分配一些磁盘空间。这样下次文件扩大时就可以使用已经分配好的空间,而不会频繁的去分配新空间。
例如ext3下,每次分配磁盘空间时,最小是分配8KB。
最小分配的副作用是会浪费一些磁盘空间(分配了但是又没有使用)
如何针对性优化:
我们在reiserfs下将最小分配空间从8KB改大到128K后提升了30%的磁盘io性能。如果当前使用场景下小文件很多,把预分配改大就会浪费很多 磁盘空间,所以这个数值要根据当前使用场景来设定。似乎要直接改源代码才能生效,不太记得了,09年的时候改的,有兴趣的同学自己google吧。
io访问调度:
在同时有多个io访问时,linux内核可以对这些io访问按LBA进行合并和排序,这样磁头在移动时,可以“顺便”读出移动过程中的数据。
SATA等磁盘甚至在磁盘中内置了io排序来进一步提升性能,一般需要在主板中进行配置才能启动磁盘内置io排序。linux的io排序是根据LBA进行的,但LBA是一个一维线性地址,无法完全反应出二维的圆形磁盘,所以磁盘的内置io排序能达到更好的效果。
如何针对性优化:
io访问调度能大幅提升io性能,前提是应用层同时发起了足够的io访问供linux去调度。
怎样才能从应用层同时向内核发起多个io访问呢?
方案一是用aio_read异步发起多个文件读写请求。
方案二是使用磁盘线程池同时发起多个文件读写请求。
对我们的http正向代理来说,采用16个线程读写磁盘可以将性能提升到2.5倍左右。具体开多少个线程/进程,可以根据具体使用场景来决定。
小提示:
将文件句柄设置为非阻塞时,进程还是会睡眠等待磁盘io,非阻塞对于文件读写是不生效的。在正常情况下,读文件只会引入十几毫秒睡眠,所以不太明显;而在磁盘io极大时,读文件会引起十秒以上的进程睡眠。
预读取:
linux内核可以预测我们“将来的读请求”并提前将数据读取出来。通过预读取可以减少读io的次数,并且减小读请求的延时。
如何针对性优化:
预读取的预测准确率是有限的,与其依赖预读取,不如我们直接开一个较大的缓冲区,一次性将文件读出来再慢慢处理;尽量不要开一个较小的缓冲区,循环读文件/处理文件。
虽然说“预读取”和“延迟分配”能起到类似的作用,但是我们自己扩大读写缓冲区效果要更好。
延迟分配:
当文件扩大,需要分配磁盘空间时,可以不立即进行分配,而是暂存在内存中,将多次分配磁盘空间的请求聚合在一起后,再进行一次性分配。
延迟分配的目的也是减少分配次数,从而减少文件不连续。
延迟分配的副作用有几个:
1、如果应用程序每次写数据后都通过fsync等接口进行强制刷新,延迟分配将不起作用
2、延迟分配有可能间歇性引入一个较大的磁盘IO延时(因为要一次性向磁盘写入较多数据)
只有少数新文件系统支持这个特性
如何针对性优化:
如果不是对安全性(是否允许丢失)要求极高的数据,可以直接在应用程序里缓存起来,积累到一定大小再写入,效果比文件系统的延迟分配更好。如果对安全性要求极高,建议经常用fsync强制刷新。
在线磁盘碎片整理:
Ext4提供了一款碎片整理工具,叫e4defrag,主要包含三个功能:
1、让每个文件连续存储
2、尽量让每个目录下的文件连续存储
3、通过整理空闲磁盘空间,让接下来的分配更不容易产生碎片
如何针对性优化:
“让每个目录下的文件连续存储”是一个极有价值的功能。
传统的做法是通过拼接图片来将这10张图片合并到一张大图中,再由前端将大图切成10张小图。
有了e4defrag后,可以将需连续访问的文件放在同一个文件夹下,再定期使用e4defrag进行磁盘整理。
实现自己的文件系统:
在大部分服务器上,不需要支持“修改文件”这个功能。一旦文件创建好,就不能再做修改 *** 作,只支持读取和删除。在这个前提下,我们可以消灭所有文件碎片,把磁盘io效率提升到理论极限。
有一个公式可以衡量磁盘io的效率:
磁盘利用率 = 传输时间/(平均寻道时间+传输时间)
如若满意,请点击回答右侧【采纳答案】,如若还有问题,请点击【追问】
~ O(∩_∩)O~
(1).系统安装优化在安装linux系统时,可以在磁盘的划分、SWAP内存的分配等加载项上做优化。
磁盘层面:磁盘分配可以遵循应用的要求:a.对于读写数据频繁但数据安全性要求不高时,可以将磁盘做成RAID0;b.对数据安全性要求高却对数据读写没有要求的可以做成RAID1;c.对读要求高,而对写 *** 作没有要求,但要保证数据安全性,则可以将磁盘做成RAID5d.对读写要求高,并且要求数据安全性高,则可以将磁盘做成RAID0+1通过不同的需求将磁盘做成不同的RAID级别,在磁盘层面对系统进行优化。
内存层面:当内存较小(物理内存小于4G),一般设置SWAP交换分区为内存的2倍,如果物理内存大于4G而小于16G,设置SWAP交换分区大小等于或略小于内存;如果内存大小大于16G,原则上可以将SWAP分区设置为0,建议设置一个一定大小的SWAP分区起缓冲作用。
(2).内核参数优化
内核参数的优化要和具体应用结合起来整体考虑,根据应用的不同要求进行参数的优化。
(3).文件系统优化
Linux下可选的文件系统有ext2、ext3、ext4、xfs和ReiserFS,根据应用的需求,选择不同的文件系统。
Linux标准文件系统是从VFS开始的,然后是ext,接着是ext2,准确来说。Ext2是linux上标准的文件系统,ext3是在ext2基础上增加日志形成的,,是基于超级块和inode的设计理念设计的。
XFS文件系统是一个高级日志文件,通过分布式处理磁盘请求、定位数据、保持cache的一致性来提供对文件系统数据的低延迟、高带宽的访问。所以XFS伸缩性较好,具有优秀的日志记录功能、可扩展性强、快速写入性能等特点。
ReiserFS是一款高性能的日志文件系统,通过平衡树结构来管理数据,包括文件数据、文件名以及日志支持等。优点是访问性能好和安全性高。具有高效、合理利用磁盘空间,先进的日志管理机制,特有的搜寻方式、海量磁盘存储等特点。
(4).应用的程序的优化
应用程序的优化主要是测试应用程序的可用性以及高效性,目的是调试应用程序是否存在bug。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)