he
# 4. 应用程序或脚本中的文件路径修改为挂载点目录下的路径
# 5. 当文件读取或写入完成后,可以通过rsync等工具将缓存中的文件同步到硬盘上,从而避免数据的丢失。
rsync -a /mnt/cache/ /path/to/files/
内存缓存适用的场景:
(1)Web服务器:在Web服务器中,通常会缓存静态文件(如CSS、java script、图片等),以提高网站的性能和响应速度。使用tmpfs作为内存缓存,可以将这些静态文件缓存到内存中,提高数据读取速度,减轻磁盘负载。
(2)数据库服务器:在数据库服务器中,经常需要将一些数据放在内存中进行缓存,以提高查询性能。使用tmpfs作为内存缓存,可以将这些数据缓存到内存中,避免频繁的磁盘IO操作,提高查询性能。
(3)虚拟机:在虚拟机环境中,可以使用tmpfs作为内存缓存,以提高虚拟机的磁盘IO性能。例如,可以将虚拟机的磁盘镜像文件(如vmdk、qcow2等)缓存到tmpfs中,避免频繁的磁盘IO操作。
5、配置大页
大页是一种特殊的内存页,它的大小通常是默认页大小的几倍,比如 2MB 或者 1GB。
在内存充足的情况下,可以提高 Linux 系统的性能。使用大页可以减少内存页表的大小,从而提高内存访问的效率。对于一些需要频繁访问内存的应用程序(比如数据库),启用大页可以显著提高性能。
例如:运行虚拟机的时候配置大页能显著提升性能。
如果内存小配置大页会降低系统的性能。
配置实现流程:
# 1. 查看是否开启大页功 默认情况下,已经开启了透明大页功能:
root@ubuntu:~# cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
# 2. 查看大页的数目 默认为0
root@ubuntu:~# cat /proc/sys/vm/nr_hugepages
0
# 也可以通过下面的方法查看
root@ubuntu:~# cat /proc/meminfo | grep -i Hugep
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 0 # 大页的总数为0
HugePages_Free: 0 # 前可用的大页数
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
# 3. 设置大页的数量 表示使用2000个2M大小的大页
echo 2000 > /proc/sys/vm/nr_hugepages
# 挂载大页
mount -t hugetlbfs nodev /PATH
# 查看是否正常挂载
cat /proc/mounts | grep hugetlbfs
6、脏数据的回收
脏数据就是对内存中已被修改但尚未写入磁盘的数据进行回收。
脏数据自动回收:
通过修改vm.dirty_expire_centisecs
和vm.dirty_writeback_centisecs
的值来调整脏数据回收的时间间隔。
# 脏数据在内存中存留的时间,单位为1/100秒
ehigh@master-1:~$ cat /proc/sys/vm/dirty_expire_centisecs
3000
# 脏数据的写入间隔时间,单位为1/100秒
ehigh@master-1:~$ cat /proc/sys/vm/dirty_writeback_centisecs
500
脏数据手动回收:
使用sync
命令将内存中的所有脏数据写回磁盘,以减少数据丢失或损坏的风险。
sync
命令会强制将文件系统中所有修改过的数据缓存写回磁盘,包括脏数据和元数据。
如何调整脏数据回收的时间:
- 如果追求系统的性能,可以把
vm.dirty_expire_centisecs
和vm.dirty_writeback_centisecs
的值改大,减少磁盘IO的操做。
- 如果追求数据的安全性,可以把
vm.dirty_expire_centisecs
和vm.dirty_writeback_centisecs
的值改小,防止数据丢失。
7、清理缓存
只有在应用程序出现崩溃或无响应的情况,系统出现“内存不足”或“无法为应用程序分配足够的内存”中各种情况可以考虑清理缓存,以确保系统的正常运行。
注意:清空缓存可能会导致系统性能下降,因为需要重新从磁盘读取数据。因此,在清空缓存之前,需要仔细考虑清空缓存的必要性,并确保系统有足够的内存来重新缓存数据。
例如:free非常小,而available比较大,说明系统正在使用大量的缓存来提高性能,并且这些缓存可以被重新分配给新的进程或应用程序,这种情况清理缓存会影响性能。
清空文件系统缓存:
ehigh@ubuntu:~$ sudo sync && echo 3 > /proc/sys/vm/drop_caches
清空内存缓存:
ehigh@ubuntu:~$ sudo echo 1 > /proc/sys/vm/drop_caches
三:磁盘的优化方法:
1、挂载参数优化
在挂载硬盘时,使用noatime选项可以避免在每次读取文件时更新文件的访问时间,减少磁盘IO操作,提高硬盘性能。在/etc/fstab文件中添加noatime选项即可。
2、文件系统优化
对于大量小文件的读写,使用 ext4 文件系统可能比使用 XFS 文件系统更适合。
Linux中一个文件的组成:
Linux上的一个文件 ≈ 一个Inode + 若干Block
Inode:存放文件的属性信息,每个Inode有一个唯一的Inode号,Inode的节点号是一个32位无符号的整型数,因此每个文件系统上的inode节点总数最多为2^32个(约42亿个)。
Block:存放文件真正的数据部分,一个Block的大小默认是4KB。
# nodes per group:表示每个块组中 inode 的数量
# Blocks per group:表示每个块组block的数量
Inode的默认分配策略:
一般系统会将1%的磁盘空间分配为inode区域,如果默认每个block的大小是4KB,Inode的默认大小是256Byte,那么一个block可以存放16个Inode。
Inode数量对硬盘的影响:
硬盘在格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
Inode数量多:能存储更多的文件,可能会造成增加磁盘碎片的概率,影响文件系统的性能,还会使得文件系统的检查变慢,导致开机变慢。
Inode数量少:存储的文件数量变少,但是最大可存储文件数量也大大减少
调整Inode的数量:
如果硬盘上存放有很多小文件,会导致Inode的数量快速被用完,造成inode 节点不足的问题。
例如:创建文件系统时手动设置 inode 数量:
# 将 inode 数量设置为 2000000
mkfs.ext4 -N 2000000 /dev/sdb1
3、根据不同的场景选择磁盘调度算法
在Linux系统中,磁盘的三种调度算法分别为 CFQ、Deadline 和 NOOP
CFQ调度算法
Linux系统默认的磁盘调度算法,