繁体   English   中英

使用不同方法的Linux功能的性能分析

[英]Performance analysis of a functionality with different approaches Linux

我知道这个问题更多是与编译器和OS相关的内容,但是如果有人可以对它有所了解,它可以帮助我进行一些优化。

我的目标是在文件夹y中创建文件X

(可能有数百万个数字,x和y也是每次调用的变体和更改。)我正在Linux上工作。

为此,我有两种方法:

首先对所需目录“ y”执行chdir,然后创建文件“ x”。

C代码:

char *dir = "/root/"; 
FILE *fd;
chdir(dir);
fd = fopen("geneliatestingN","a+");
fprintf(fd,"ansh");
fclose(fd);

strace的:

1329039557.874631 chdir("/root/")       = 0
1329039557.874704 brk(0)                = 0x9ad6000
1329039557.874726 brk(0x9af7000)        = 0x9af7000
1329039557.874757 open("geneliatestingN", O_RDWR|O_CREAT|O_APPEND, 0666) = 3
1329039557.874817 fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
1329039557.874869 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fcb000
1329039557.874899 write(3, "ansh", 4)   = 4
1329039557.874940 close(3)              = 0

第二种方法是只提供文件的绝对路径并创建它。

C代码:

sprintf(filepath, "%s/geneliatestingS",dir);
fd = fopen(filepath,"a+");
fprintf(fd,"ansh Testing again");
fclose(fd);

strace的:

1329039557.875000 open("/root//geneliatestingS", O_RDWR|O_CREAT|O_APPEND, 0666) = 3
1329039557.875046 fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
1329039557.875096 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fcb000
1329039557.875123 write(3, "ansh Testing again", 18) = 18
1329039557.875160 close(3)              = 0

因此,从根本上来说,哪种更好的方法可以完成此功能,而这两者将消耗更少的指令周期,在CPU和执行时间上都更加高效。

您将受I / O约束,而不受CPU约束。

您可能在错误的级别进行了优化-不管您使用这种设计做什么,CPU都将在驱动器磨削的同时等待着。

在我的头顶上,我肯定会研究:

  • 您的HDD磁头需要花费多长时间。 我敢打赌,通过在写入磁盘之前对这些目录进行排序,以最大程度地减少寻道,您可以比降低CPU周期更好地进行优化。
  • 从顶部完全重新设计您的系统:除了编写1000万个目录之外,还请考虑其他模型。 您可以编写较少数量的文件,而可以使用mmap()代替吗? 请注意,问题不只是将这些数据写入磁盘-您的设计选择可能会极大地影响用户想要访问时将这些数据读回内存的速度。 例如,如果您有十个用户想要文件系统所有不同部分中的文件,则HDD将成为您的瓶颈。
  • 根据您的应用程序, Nosql数据库可能更适合您。

获得良好答案的唯一方法是尝试使用您的特定系统并进行评估。

但是,我认为减少系统调用次数应该会更好。

实际上,您可能正在考虑在同一目录中写入大量文件。 最近的文件系统已经建立了索引目录,但是一些较旧的文件系统却没有索引(因此,对于这样的旧文件系统,文件创建或查找操作在每个目录中的条目数上都是线性的)。

考虑在某个目录/foo写入数千个文件时,一个老技巧是创建几十个子目录(如/foo/1/ /foo/2/并在每个这样的子目录中填充几百个条目。

这样做的另一个原因是因为交互式shell(带有文件完成功能)在包含成千上万个条目的目录中不太满意。

和往常一样,您的里程可能会有所不同。

如果您想拥有成千上万个小文件,则可以考虑其他解决方案,例如数据库(例如,带有MySQL或PostGresQL客户端库和服务器)或GDBM索引文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM