记录踩坑的一期
(最近陪家猫看猫和老鼠有点上瘾)
经过上轮的改造,查询数据可以一个rpc过去,然后就进行大数据实验。
实验瓶颈
服务端数据可以推进到2^25
客户端还是1000查
服务端数据2^26的时候就会在布谷hash的插入这里报Java堆溢出。
edu.alibaba.mpc4j.common.tool.hashbin.object.RandomPadHashBin.insertItems(RandomPadHashBin.java:156)
根据提示就优化一下呗
之前还改了两个地方
老铁们还记得上文说init初始化分几步嘛,三步,1 oprf 2 布谷Hash 3 多项式大循环
然后多项式大循环中有多层for嵌套,异常复杂,涉及逻辑没敢动,就把几个循环parallel了一下,速度蹭就上来了,然后布谷hash中的insertItems进行了一个分块尝试
这里踩坑了
修改完就package,扔服务器一顿测试,然后啥也没变,注意这个方法在
mpc4j-common-tool包里,跨模块了,所有要先到mpc4j-common-tool模块mvn clean package,mvn clean install,然后再到mpc4j-s2pc-pir中mvn clean package
这里提示每次报错如果一样的话,注意看下是不是同一行,如果是同一行很可能是修改没生效
mpc4j匹配的实验参数
实际上这样改不是最优解,因为服务端的传输数据会突然变的小很多,实际上应该对不同数据量匹配不同的参数,mpc4j中只举例了三组数据,在APSI的Parameters文件中有大数据量更为精准的匹配,比如16M/256M的,
对于2^25(3KW)的server端数据,用16M-4096做实验查询,堆溢出
Heap
PSYoungGen total 9219584K, used 3905855K [0x0000000580100000, 0x0000000800000000, 0x0000000800000000)
eden space 7988224K, 48% used [0x0000000580100000,0x000000066eaa76f0,0x0000000767a00000)
from space 1231360K, 0% used [0x00000007b4d80000,0x00000007b4d80000,0x0000000800000000)
to space 1248256K, 0% used [0x0000000767a00000,0x0000000767a00000,0x00000007b3d00000)
ParOldGen total 20970496K, used 20970411K [0x0000000080200000, 0x0000000580100000, 0x0000000580100000)
object space 20970496K, 99% used [0x0000000080200000,0x00000005800eac78,0x0000000580100000)
Metaspace used 16157K, capacity 16718K, committed 17152K, reserved 1064960K
class space used 1832K, capacity 1977K, committed 2048K, reserved 1048576K
可能原因
JNI global references: 456
JNI全局引用过多:另一个问题可能是JNI全局引用过多,这可能会导致内存泄漏。确保JNI全局引用在不再需要时被适当地释放。
把初始堆和最大堆的数据由150G调整到200G就得到了查询结果
查2^26的数据量
256M-4096
94.08467 分钟预处理 85.95726667 分钟
Party ID Server Set Size Query Number Is Parallel Thread Num Init Time(ms) Init DataPacket Num Init Payload Bytes(B) Init Send Bytes(B) Pto Time(ms) Pto DataPacket Num Pto Payload Bytes(B) Pto Send Bytes(B)
0 67108864 1000 true 47 4597997 1 48 68 35711 3 8099708 8102010
Party ID Server Set Size Query Number Is Parallel Thread Num Init Time(ms) Init DataPacket Num Init Payload Bytes(B) Init Send Bytes(B) Pto Time(ms) Pto DataPacket Num Pto Payload Bytes(B) Pto Send Bytes(B) Memory
1 67108864 1000 true 47 560439 1 1639434 1639460 35933 2 8689154 8691327 8726352
256M-1024
80.72723 分钟 初始化79.85176667 分钟
Party ID Server Set Size Query Number Is Parallel Thread Num Init Time(ms) Init DataPacket Num Init Payload Bytes(B) Init Send Bytes(B) Pto Time(ms) Pto DataPacket Num Pto Payload Bytes(B) Pto Send Bytes(B)
0 67108864 1000 true 47 4227098 1 48 68 25727 3 6919156 6921426
Party ID Server Set Size Query Number Is Parallel Thread Num Init Time(ms) Init DataPacket Num Init Payload Bytes(B) Init Send Bytes(B) Pto Time(ms) Pto DataPacket Num Pto Payload Bytes(B) Pto Send Bytes(B) Memory
1 67108864 1000 true 47 563908 1 1639434 1639460 25901 2 2917718 2919803 8726352
对比看到明显计算量变小时间也缩短
交互过程
server
初始化
- 获取client端公钥,计算server端数据PRFs
- 计算server端数据布谷hash bin,发送布谷hash key
- 计算server端数据多项式
pir交互
- 接收查询盲化数据,计算OPRF--这个是计算client端查询数据的,发送
- 接收查询数据,计算求交,产生查询返回
client
初始化
- 产生公私密钥对,发送公钥对
- 接收布谷hash key
pir交互
- 产生查询盲化数据,发送盲化数据
- 接收盲化prf数据
- 产生查询数据的布谷Hash bin,发送
- 接收查询结果 key和value 应该就是查询数据和labeled