0%

scudo配置

scudo_allocate.drawio

下面的参考数据仅是指64位程序的, 32位的配置和64位不同.

  • M_TSDS_COUNT_MAX

    设置线程局部存储(TSL)相关的TSD的数目, M_TSDS_COUNT_MAX设置为8后, 如小于等于8个线程, 每个线程会绑定一个TSD.

    在每个线程中 使用malloc free时, 会根据线程状态寄存器查找到其绑定的TSD缓存池.

    ​ scudo没有外部配置的情况下, 只有两个TSD缓存池, 在配置M_TSDS_COUNT_MAX后, 会产生最多M_TSDS_COUNT_MAX个缓存池, 该值会影响 small(primary) 分配器. 在TSD缓存池少的情况下, 会出现多个线程共用一个TSD缓存池的情况, 分配释放内存时需要等锁.

    Secondary 分配器没有绑定TSD(不是线程私有), 是所有线程共用同一块缓存池, 分配释放需要加锁等锁.

    jemalloc5 中 在sz index(36-45范围内的), 当前的配置字节在(14336- 65536)) 使用的缓存是绑定tcache的(线程私有).

  • M_CACHE_COUNT_MAX

    option->MaxCacheEntriesCount

    large(Secondary) 分配器在分配释放内存时, 所有线程共用的缓存池的容量, 每次free 时, 会先将该内存单元放到缓存池中, 下次malloc时, 会优先根据分配的size 在缓存池中查找是否有匹配的缓存内存单元, 如果有则直接把该内存单元的地址返回给调用方.

    large(Secondary)的缓存池在满了以后, 下一次free时, 会重置清空缓存池

    该值对应上图的 EntriesArraySize, 默认值为32, 最大只能设置到256, 如果超过256, 会设置失败, 用默认值.

  • M_CACHE_SIZE_MAX

    option->MaxCacheEntrySize

    在free时, large(Secondary) 分配器并不是将所有大于small分配器的内存单元全部放到缓存池中, 而是在 0x40010-M_CACHE_SIZE_MAX范围内的会在free时放到缓存池中(small的范围0-0x40010), malloc时会优先从缓存池中查找. 而大于M_CACHE_SIZE_MAX的malloc则直接走mmap, free走unmap.

    该值对应上图的 MaxEntrySize, 默认值是2M