Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 证明使用共享对象多次运行的可执行文件工作正常,并且使用的内存比静态链接的版本少_C++_Linux_Gcc_Memory_Pmap - Fatal编程技术网

C++ 证明使用共享对象多次运行的可执行文件工作正常,并且使用的内存比静态链接的版本少

C++ 证明使用共享对象多次运行的可执行文件工作正常,并且使用的内存比静态链接的版本少,c++,linux,gcc,memory,pmap,C++,Linux,Gcc,Memory,Pmap,我有一个二进制文件,用于一个用C/C++编写的程序,该程序将在同一台服务器(Linux CentOS 7,x64)上运行多次,以便在远程服务器上模拟负载测试。可执行文件可以静态链接(.a)或动态链接(.so)到依赖库 为了运行尽可能多的副本,我们正在尝试运行使用动态链接的版本,以便在进程之间共享尽可能多的内存,但是这似乎没有什么区别(如果有什么区别的话,它会稍微差一点) 例如,运行静态链接进程的9000个拷贝使用43gb RAM,使用动态链接进程使用48gb RAM) 使用“pmap-XX”可以

我有一个二进制文件,用于一个用C/C++编写的程序,该程序将在同一台服务器(Linux CentOS 7,x64)上运行多次,以便在远程服务器上模拟负载测试。可执行文件可以静态链接(.a)或动态链接(.so)到依赖库

为了运行尽可能多的副本,我们正在尝试运行使用动态链接的版本,以便在进程之间共享尽可能多的内存,但是这似乎没有什么区别(如果有什么区别的话,它会稍微差一点)

例如,运行静态链接进程的9000个拷贝使用43gb RAM,使用动态链接进程使用48gb RAM)

使用“pmap-XX”可以看出共享对象的使用是正确的(例如,对于其中一个对象,libPocoFoundation.so):

地址置换偏移设备索引节点大小Rss Pss共享\u干净共享\u脏私有\u干净私有\u脏引用匿名匿名匿名交换内核PageSize MMUPageSize锁定VmFlagsMapping 7f6a9498c000 r-xp 00000000 fd:00 26053805 1940 844 422 844 0 0 0 0 0 0 0 0 0第四次前mr mw me sd libPocoFoundation.so 7f6a94b71000---p 001e5000 fd:00 26053805 2044 0 0 0 0 4 0 mr mw me sd libPocoFoundation.so 7f6a94d70000 r--p 001e4000 fd:00 26053805 60 0 0 0 0 0 60 32 60 0 0 4 0第三次mr mw me ac sd libPocoFoundation.so 7f6a94d7f000 rw-p 001f3000 fd:00 26053805 16 16 0 0 0 0 0 0 16 16 0 0 0 4 4 0第三次水资源mr mw me ac sd libPocoFoundation.so 对于libPocoFoundation,Shared_Clean有一个重要的价值。所以我认为这是可行的

我能找到的所有检查可用内存的工具(meminfo.py、top、free、smem、htop)似乎都大致同意使用和释放的内存量是相同的,所以我倾向于相信这些数字

所有库(和可执行文件)都是使用gcc/g++4.9.2使用-fPIC编译的(由于此产品是在非常旧的平台上编译的,因此需要使用较旧的版本)

有人能解释为什么这不起作用(或者至少看起来不起作用)或者我做错了什么吗


非常感谢。

内核将以CoW(写时复制)方式在多个实例之间透明地共享可执行文件的页面,而不管库是如何链接的。如果许多不同的应用程序链接到同一个库,那么使用共享库将主要节省一点磁盘空间。谢谢Jesper-经过更多的调查,似乎你是对的,静态链接的可执行文件在内存中共享,因此,共享库的唯一好处是。正如你所描述的那样,减少磁盘空间(这真的很小!)以及在不升级应用程序的情况下升级.so的能力。内核将以CoW(写时复制)方式在多个实例之间透明地共享可执行文件的页面,而不管库是如何链接的。如果许多不同的应用程序链接到同一个库,那么使用共享库将主要节省一点磁盘空间。谢谢Jesper-经过更多的调查,似乎你是对的,静态链接的可执行文件在内存中共享,因此,共享库的唯一好处是。正如你所描述的那样,减少磁盘空间(这真的很小!)以及升级的能力。因此无需升级应用程序。 Address Perm Offset Device Inode Size Rss Pss Shared_Clean Shared_Dirty Private_Clean Private_Dirty Referenced Anonymous AnonHugePages Swap KernelPageSize MMUPageSize Locked VmFlagsMapping 7f6a9498c000 r-xp 00000000 fd:00 26053805 1940 844 422 844 0 0 0 844 0 0 0 4 4 0 rd ex mr mw me sd libPocoFoundation.so 7f6a94b71000 ---p 001e5000 fd:00 26053805 2044 0 0 0 0 0 0 0 0 0 0 4 4 0 mr mw me sd libPocoFoundation.so 7f6a94d70000 r--p 001e4000 fd:00 26053805 60 60 60 0 0 0 60 32 60 0 0 4 4 0 rd mr mw me ac sd libPocoFoundation.so 7f6a94d7f000 rw-p 001f3000 fd:00 26053805 16 16 16 0 0 0 16 16 16 0 0 4 4 0 rd wr mr mw me ac sd libPocoFoundation.so