编程接口指南

使用 madv.so.1

madv.so.1 共享对象允许为已启动的进程及其后代有选择性地配置虚拟内存建议。要使用该共享对象,环境中必须存在以下字符串:

LD_PRELOAD=$LD_PRELOAD:madv.so.1

madv.so.1 共享对象应用由 MADV 环境变量的值指定的内存建议。MADV 环境变量指定用于进程地址空间中的所有堆、共享内存和 mmap 区域的虚拟内存建议。此建议应用于所有已创建的进程。MADV 环境变量的以下值影响 lgroup 之间的资源分配:

access_default

此值将内核的预期访问模式重置为缺省设置。

access_lwp

此值通知内核,移近地址范围的下一个 LWP 就是将要访问此范围次数最多的 LWP。内核将相应地为此范围和 LWP 分配内存和其他资源。

access_many

此值建议内核,许多进程或 LWP 将在系统内随机访问内存。内核将相应地分配内存和其他资源。

MADVCFGFILE 环境变量的值是一个文本文件的名称,此文件中包含一个或多个形式为 exec-name:advice-opts 的内存建议配置项。

exec-name 的值是应用程序或可执行文件的名称。exec-name 的值可以是完整路径名、基本名称或模式字符串。

advice-opts 值的形式为 region=adviceadvice 的值与 MADV 环境变量的值相同。可将 region 替换为以下任一合法值:

madv

建议应用于进程地址空间中的所有堆、共享内存和 mmap(2) 区域。

heap

堆被定义为 brk(2) 区域。建议应用于现有堆以及将来分配的任何其他堆内存。

shm

建议应用于共享内存段。有关共享内存操作的更多信息,请参见 shmat(2)

ism

建议应用于使用 SHM_SHARE_MMU 标志的共享内存段。ism 选项优先于 shm

dsm

建议应用于使用 SHM_PAGEABLE 标志的共享内存段。dsm 选项优先于 shm

mapshared

建议应用于由 mmap() 系统调用使用 MAP_SHARED 标志建立的映射。

mapprivate

建议应用于由 mmap() 系统调用使用 MAP_PRIVATE 标志建立的映射。

mapanon

建议应用于由 mmap() 系统调用使用 MAP_ANON 标志建立的映射。当多个选项都适用时,mapanon 选项优先。

MADVERRFILE 环境变量的值是在其中记录错误消息的路径的名称。如果缺少 MADVERRFILE 位置,则 madv.so.1 共享对象将使用 syslog(3C) 记录错误,而使用 LOG_ERR 作为严重级别,使用 LOG_USER 作为功能描述符。

内存建议将被继承。子进程与其父级具有相同的建议。调用 exec(2) 之后,会将此建议重置为系统缺省建议,除非使用 madv.so.1 共享对象配置了不同级别的建议。建议仅应用于用户程序显式创建的 mmap() 区域。由运行时链接程序或执行直接系统调用的系统库建立的区域不受影响。

madv.so.1 用法示例

以下示例说明了 madv.so.1 共享对象的特定方面。


示例 4–2 为应用程序集合设置建议

此配置将建议应用于 exec 名称以 foo 开头的应用程序的所有 ISM 段。

$ LD_PRELOAD=$LD_PRELOAD:madv.so.1

$ MADVCFGFILE=madvcfg

$ export LD_PRELOAD MADVCFGFILE

$ cat $MADVCFGFILE

        foo*:ism=access_lwp


示例 4–3 从建议中排除应用程序集合

此配置为除 ls 之外的所有应用程序设置建议。

$ LD_PRELOAD=$LD_PRELOAD:madv.so.1

$ MADV=access_many

$ MADVCFGFILE=madvcfg

$ export LD_PRELOAD MADV MADVCFGFILE

$ cat $MADVCFGFILE

        ls:


示例 4–4 配置文件中的模式匹配

由于 MADVCFGFILE 中指定的配置优先于 MADV 中设置的值,因此指定 * 作为最后一个配置项的 exec-name 相当于设置 MADV。本示例与上一个示例等效。

$ LD_PRELOAD=$LD_PRELOAD:madv.so.1

$ MADVCFGFILE=madvcfg

$ export LD_PRELOAD MADVCFGFILE

$ cat $MADVCFGFILE

        ls:

        *:madv=access_many


示例 4–5 针对多个区域的建议

此配置为 mmap() 区域应用一类建议,为 exec() 名称以 foo 开头的应用程序的堆和共享内存区域应用不同的建议。

$ LD_PRELOAD=$LD_PRELOAD:madv.so.1

$ MADVCFGFILE=madvcfg

$ export LD_PRELOAD MADVCFGFILE

$ cat $MADVCFGFILE

        foo*:madv=access_many,heap=sequential,shm=access_lwp