线程环境变量
在 libpthreads.a 框架内部,提供了一系列的调整旋钮,它们可能会影响应用程序的性能。
如有可能,请使用前端 shell 脚本调用二进制可执行程序。 该 shell 脚本应该指定您希望覆盖下面部分中所述环境变量的系统缺省值的新值。
AIXTHREAD_COND_DEBUG
AIXTHREAD_COND_DEBUG 变量维护供调试器使用的条件变量的列表。 如果程序包含大量活动的条件变量,并且频繁创建和破坏条件变量,那么维护该条件变量列表可能会产生更大的开销。 将该变量设置为 OFF 将禁用该列表。 使该变量处于开启状态可使得调试线程应用程序更为容易,但可能会强加一些开销。
AIXTHREAD_ENRUSG
AIXTHREAD_ENRUSG 变量启用或禁用 pthread 资源收集。 开启这个变量会允许对一个进程中所有 pthread 进行资源收集,但是会增加一些开销。
AIXTHREAD_GUARDPAGES=n
* +-----------------------+
* | pthread attr |
* +-----------------------+ <--- pthread->pt_attr
* | pthread struct |
* +-----------------------+ <--- pthread->pt_stk.st_limit
* | pthread stack |
* | | |
* | V |
* +-----------------------+ <--- pthread->pt_stk.st_base
* | RED ZONE |
* +-----------------------+ <--- pthread->pt_guardaddr
* | pthread private data |
* +-----------------------+ <--- pthread->pt_data
以上插图中的 RED ZONE 称为保护页。pthread attr、pthread 和 ctx 代表为一个 pthread 分配的内存的 PTH_FIXED 部分。
对于 32 位,近似字节大小在下图的方括号中标出。 对于 64 位,组成 PTH_FIXED 的片段应该稍大一些,并且键数据应为 8 K,而其他方面一样。
* +-----------------------+
* | page alignment 2 |
* | [8K-4K+PTH_FIXED-a1] |
* +-----------------------+
* | pthread ctx [368] |
* +-----------------------+<--- pthread->pt_attr
* | pthread attr [112] |
* +-----------------------+ <--- pthread->pt_attr
* | pthread struct [960] |
* +-----------------------+ <--- pthread
* | pthread stack | pthread->pt_stk.st_limit
* | |[96K+4K-PTH_FIXED] |
* | V |
* +-----------------------+ <--- pthread->pt_stk.st_base
* | RED ZONE [4K] |
* +-----------------------+ <--- pthread->pt_guardaddr
* | pthread key data [4K] |
* +-----------------------+ <--- pthread->pt_data
* | page alignment 1 (a1) |
* | [<4K] |
* +-----------------------+
The RED ZONE on this illustration is called the Guardpage.
要添加到 pthread 栈尾的保护页的数量(十进制)为 n,该值覆盖创建 pthread 时所指定的属性值。 如果应用程序指定它自身的堆栈,那么不创建任何保护页。 缺省值为 0 且 n 必须为正值。
保护页的字节数由 n 乘以 PAGESIZE 决定。 页大小是系统决定的大小。
AIXTHREAD_DISCLAIM_GUARDPAGES
AIXTHREAD_DISCLAIM_GUARDPAGES 变量控制在创建 pthread 堆栈时是否释放堆栈保护页。 如果 AIXTHREAD_DISCLAIM_GUARDPAGES=ON,那么将释放保护页。 如果 pthread 堆栈没有任何保护页,那么设置 AIXTHREAD_DISCLAIM_GUARDPAGES 变量将没有任何效果。
AIXTHREAD_MNRATIO
AIXTHREAD_MNRATIO 变量控制库的缩放因子。 该比率在创建和终止 pthread 时使用。 它对于带有极大量线程的应用程序可能很有用。 但它总是测试 1:1 的比率,因为它可以提供更好的性能。
AIXTHREAD_MUTEX_DEBUG
AIXTHREAD_MUTEX_DEBUG 变量维护供调试器使用的活动互斥对象的列表。 如果程序包含大量活动的互斥对象,并且频繁创建和破坏互斥对象,那么维护该互斥对象列表可能会产生更大的开销。 将变量设置为ON使调试线程应用程序变得更容易,但可能会施加额外的开销。 将变量设置为OFF禁用列表。
AIXTHREAD_MUTEX_FAST
如果程序由于严重的互斥争用而迂到性能下降的情况,那么将此变量设置为ON将强制 pthread 库使用仅在进程专用互斥对象上起作用的优化互斥锁定机制。 这些进程私有互斥对象必须使用 pthread_mutex_init 例程进行初始化,并且必须使用 pthread_mutex_destroy 例程破坏。 将变量设置为OFF强制 pthread 库使用缺省互斥锁定机制。
AIXTHREAD_READ_GUARDPAGES
AIXTHREAD_READ_GUARDPAGES 变量启用或禁用对添加到 pthread 栈尾的保护页的读访问。 有关 pthread 创建的 guardpages 的更多信息,请参阅 AIXTHREAD_GUARDPAGES=n。
AIXTHREAD_RWLOCK_DEBUG
AIXTHREAD_RWLOCK_DEBUG 变量维护供调试器使用的读写锁的列表。 如果程序包含很多活动的读写锁并经常创建和破坏读写锁,那么维护这个读写锁列表可能产生更大的开销。 将变量设置为OFF将禁用该列表。
AIXTHREAD_SUSPENDIBLE={ON|OFF}
- pthread_getrusage_np
- pthread_cancel
- pthread_detach
- pthread_join
- pthread_getunique_np
- pthread_join_np
- pthread_setschedparam
- pthread_getschedparam
- pthread_kill
AIXTHREAD_SCOPE={S|P}
S 选项表示系统范围的争用作用域 (1:1),而 P 选项表示进程范围的争用作用域 (M:N)。 必须指定这两个选项之一;缺省值为 S。
使用 AIXTHREAD_SCOPE 环境变量仅影响那些以缺省属性创建的线程。 当 pthread_create() 子例程的 attr 参数为 NULL 时,将使用缺省属性。
如果所创建的用户线程具有系统范围的作用域,那么会将它绑定到内核线程并由内核调度。 底层的内核线程是不与任何其他用户线程共享的。
- 它没有专用内核线程。
- 它在用户方式下休眠。
- 当它等待处理器时,将置于用户运行队列中。
- 它受制于用户调度程序进行的时间分片。
测试表明,某些应用程序使用 1:1 模型可能性能要好得多。
AIXTHREAD_SLPRATIO
AIXTHREAD_SLPRATIO 线程调整变量控制应该预留给休眠线程的内核线程数。 一般来说,需要用来支持睡眠 pthread 的内核线程数比较少,因为 pthread 通常是一次只唤醒一个。 这节约了内核资源。
AIXTHREAD_STK=n
AIXTHREAD_STK=n 线程调整变量控制应为每个 pthread 分配的字节数(十进制)。 该值可由 pthread_attr_setstacksize 覆盖。
AIXTHREAD_AFFINITY={default|strict|first-touch}
- default 选项不会尝试以任何特殊方式放置此数据,而是在系统设置确定的进程使用的内存区域间均衡放置此数据。
- strict 选项始终将此数据放置在 pthread 本地的内存中;这可能导致创建 pthread 期间性能降低,因为现有数据将从一个内存区域迁移至另一个内存区域,但这样做可改进运行时性能。
- first touch 选项与将数据放置到 pthread 本地的内存中的方式类似,但它不会尝试迁移内存中的任何数据。 内存中的页面是此数据的线程所需的(包括从调页空间中进行内存中页面调度),并且将放置在本地。 此选项在启动时间与运行时性能之间获取平衡。
AIXTHREAD_PREALLOC=n
AIXTHREAD_PREALLOC 变量指定在线程创建期间要预分配和释放的字节数。 通过避免同时从多个线程调用 sbrk(),一些多线程应用程序可受益于此。
缺省值为 0 且 n 必须为正值。
AIXTHREAD_HRT
AIXTHREAD_HRT=true 变量允许应用程序 pthreads 高分辨率超时。 您必须拥有 root 权限,或者 CAP_NUMA_ATTACH 能力,才能启用高分辨率超时。 如果您没有所需权限或能力,那么忽略此环境变量。
MALLOCBUCKETS
malloc 存储区提供一种可选的基于存储区的缺省分配器扩展。 这旨在针对那些发出大量小分配请求的应用程序提高 malloc 性能。 当 malloc 存储区启用以后,预定义块大小范围内的分配请求将由 malloc 存储区处理。 所有其他请求则由缺省分配器以一般方式处理。
malloc 存储区缺省情况下不启用。 它是通过设置 MALLOCTYPE 和 MALLOCBUCKETS 环境变量以在进程启动前启用和配置的。
有关 malloc 存储区的更多信息,请参阅 常规编程概念: 编写和调试程序。
MALLOCMULTIHEAP={considersize,heaps:n}
需要有多个堆以便线程应用程序能有多于一个的线程发出 malloc()、free() 和 realloc() 子例程调用。 如果只有一个堆,那么所有尝试进行 malloc()、free() 或 realloc() 调用的线程将序列化(也就是说,一次只能进行一个调用)。 其结果是多处理器机器会受到严重的影响。 在多堆情况下,每个线程可以得到它自己的堆。 如果所有堆都正在使用,那么任何尝试进行调用的新线程都必须等待,直到一个或多个堆可用为止。 序列化仍然存在,但是发生序列化的可能性以及发生时所造成的影响将大大降低。
为了处理这种方式,线程安全锁定已经改变了。 每一个堆都有它自身的锁,而且锁定例程“明智地”选择某个堆以试图防止序列化。 如果在 MALLOCMULTIHEAP 环境变量中设置了 体贴大小 选项,那么选择还将尝试选择任何具有足够可用空间来处理请求的可用堆,而不是仅选择下一个未锁定的堆。
MALLOCMULTIHEAP=considersize,heaps:3选项为:- considersize
- 此选项使用另一种堆选择算法,该算法尝试使进程的工作集大小最小化。 缺省情况下不使用此选项,而是使用更快的算法。
- 堆:n
- 使用此选项可更改堆的数量。 n 的有效范围为 1 到 32。 If you set N to a number outside of this range (that is, if N<=0 or N>32), N will be set to 32.
MALLOCMULTIHEAP 的缺省值为 NOT SET(只使用第一个堆)。 如果设置了环境变量 MALLOCMULTIHEAP(例如,MALLOCMULTIHEAP=1),那么线程应用程序将能够使用所有 32 个堆。 设置 MALLOCMULTIHEAP=heaps:n 将把堆数限制为 n,而不是 32 个堆。
有关更多信息,请参阅 常规编程概念: 编写和调试程序中的 Malloc Multiheap 部分。
SPINLOOPTIME=n
SPINLOOPTIME 变量控制系统在不采取辅助操作(例如调用内核以让出进程)的情况下,尝试获得繁忙互斥对象或自旋锁的次数。 这种控制是面向 MP 系统的,希望在其上释放由另一个正在活跃运行的 pthread 持有的锁。 该参数只在 libpthreads(用户线程)中工作。 如果锁通常在一小段时间里可用,您也许想通过设置这个环境变量来增加自旋时间。 在生成另一个 pthread 之前重试繁忙锁定的次数为 n。 缺省值为 40 , n 必须是正值。
MAXSPIN 内核参数会影响内核锁例程中的旋转(请参阅 使用 schedo 命令修改 MAXSPIN 参数)。
YIELDLOOPTIME=n
YIELDLOOPTIME 变量控制系统在锁上实际转入休眠之前,在尝试获得繁忙互斥对象或自旋锁时让出处理器的次数。 如果有另一个具备足够优先级的可执行内核线程,那么处理器将让给该内核线程。 已经证明这个变量在多个锁被使用的复杂应用程序中是有效的。 在阻塞一个繁忙的锁之前让出处理器的次数为 n。 缺省值为 0 且 n 必须为正值。