面试题答案
一键面试用户态C代码层面优化
- 减少系统调用次数
- 原理:系统调用存在用户态到内核态的上下文切换开销。例如,频繁调用
write
函数写文件会产生大量上下文切换。 - 实现:使用缓冲区,如标准I/O库中的
setvbuf
函数设置缓冲区大小。示例代码:
#include <stdio.h> int main() { FILE *fp = fopen("test.txt", "w"); char buffer[4096]; setvbuf(fp, buffer, _IOFBF, sizeof(buffer)); // 后续进行文件写入操作 fclose(fp); return 0; }
- 原理:系统调用存在用户态到内核态的上下文切换开销。例如,频繁调用
- 使用异步I/O
- 原理:允许应用程序在发起I/O操作后继续执行其他任务,而无需等待I/O完成。
- 实现:在Linux下可以使用
aio
系列函数,如aio_write
。示例代码:
#include <aio.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> int main() { int fd = open("test.txt", O_WRONLY | O_CREAT, 0644); struct aiocb cb; char buf[] = "Hello, world!"; cb.aio_fildes = fd; cb.aio_buf = buf; cb.aio_nbytes = sizeof(buf); cb.aio_offset = 0; aio_write(&cb); // 可以在此执行其他任务 aio_suspend(&cb, 1, NULL); close(fd); return 0; }
- 选择合适的I/O模式
- 原理:根据应用场景选择同步或异步、阻塞或非阻塞I/O模式。例如,对于实时性要求高的应用,非阻塞I/O可能更合适。
- 实现:对于文件描述符,可以通过
fcntl
函数设置为非阻塞模式。示例代码:
#include <fcntl.h> #include <stdio.h> int main() { int fd = open("test.txt", O_RDONLY); int flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK); // 后续进行文件读取操作 close(fd); return 0; }
内核态文件系统交互层面优化
- 调整内核参数
dirty_ratio
和dirty_background_ratio
- 原理:
dirty_ratio
表示系统内存中脏页(已修改但未写入磁盘的页)达到系统内存的百分比时,开始强制将脏页写回磁盘;dirty_background_ratio
表示当脏页达到系统内存的一定百分比时,开始在后台将脏页写回磁盘。合理调整这两个参数可以平衡I/O性能和系统内存使用。 - 修改方式:可以通过修改
/proc/sys/vm/dirty_ratio
和/proc/sys/vm/dirty_background_ratio
文件来调整,例如:
echo 30 > /proc/sys/vm/dirty_ratio echo 10 > /proc/sys/vm/dirty_background_ratio
- 原理:
swappiness
- 原理:该参数控制系统将内存数据交换到磁盘交换空间(swap)的倾向程度,取值范围0 - 100。降低
swappiness
可以减少不必要的磁盘I/O,因为交换操作会严重影响磁盘I/O性能。 - 修改方式:修改
/proc/sys/vm/swappiness
文件,例如:
echo 10 > /proc/sys/vm/swappiness
- 原理:该参数控制系统将内存数据交换到磁盘交换空间(swap)的倾向程度,取值范围0 - 100。降低
- 文件系统选择与挂载选项
- 文件系统选择
- 原理:不同的文件系统在性能上有差异。例如,
ext4
文件系统在一般场景下表现良好,而XFS
文件系统对于大文件和高并发I/O有更好的性能。 - 选择方法:根据应用的具体需求选择合适的文件系统,在格式化分区时指定,如
mkfs.ext4 /dev/sda1
或mkfs.xfs /dev/sda1
。
- 原理:不同的文件系统在性能上有差异。例如,
- 挂载选项
- 原理:挂载选项可以优化文件系统的行为。例如,
noatime
选项可以避免每次访问文件时更新文件的访问时间,减少不必要的I/O操作。 - 实现:在挂载文件系统时指定选项,如
mount -o noatime /dev/sda1 /mnt
。
- 原理:挂载选项可以优化文件系统的行为。例如,
- 文件系统选择