swoole table内存占用由行数、列大小和哈希节点开销决定,总内存≈行数×(列总size+每行节点开销),如10000行每行48字节数据加16字节开销共约625KB,需预估容量避免浪费。
Swoole的Table内存占用是预分配的,使用共享内存实现,适用于多进程间高效读写。要准确计算其内存占用,需理解其结构组成和底层机制。
Table结构组成
Swoole Table本质是一个基于共享内存的高性能哈希表,其总内存由以下几个部分构成:
- 行数(rows):创建Table时指定的最大行数,决定存储容量
- 列定义总大小:每列类型(int、String、Float)和长度(仅string需要)之和
- 哈希索引结构开销:用于冲突链和查找,通常为行数 × 指针大小(64位系统约8字节)
内存计算公式
总内存 ≈ 行数 × (所有列size之和 + 哈希节点额外开销)
具体拆解如下:
- 每行数据区 = 所有列定义的size相加(string按设定长度算)
- 每行哈希节点开销 ≈ 16~24字节(含next指针、hash值、key等)
- 总内存 = rows × (列总size + 节点开销)
注意:Swoole Table不允许动态扩容,必须在创建时确定最大行数和列结构。
实际例子
假设创建一个用户在线状态表:
$table = new SwooleTable(10000); $table->column('uid', SwooleTable::TYPE_INT, 8); $table->column('token', SwooleTable::TYPE_STRING, 32); $table->column('login_time', SwooleTable::TYPE_FLOAT); $table->create();
内存计算:
- 每行数据:8(int)+ 32(string)+ 8(float)= 48字节
- 每行节点开销:约16字节(估算)
- 总内存 ≈ 10000 × (48 + 16) = 640,000 字节 ≈ 625 KB
查看实际占用
ipcs -m
或在php中通过swoole_table->stats()
获取行使用统计,间接判断密度。
基本上就这些。设计时建议预留足够行数,但避免过度分配,因为内存一旦分配无法释放。