我在GraphDB上运行“大”SAPRQL INSERT WHERE
,它似乎没有使用所有可用的物理RAM。
我使用的是64GB,4核CentOS 6.9服务器
-bash-4.1$ free -m
total used free shared buffers cached
Mem: 64428 21897 42530 0 107 2877
-/+ buffers/cache: 18912 45515
Swap: 8095 0 8095
我像这样开始使用GraphDB 8.3.0:
graphdb -Xms50g -Xmx50g -d
这是一个非推理回购,如果这有任何区别
这是sysinfo页面所说的内容
申请信息:
OS: Linux 2.6.32-696.6.3.el6.x86_64
Java: Oracle Corporation 1.8.0_144
Memory used: 5554 MB
Max memory: 50977 MB
JVM参数
-Xms1g
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
-Djava.net.preferIPv4Stack=true
-XX:+UseParallelGC
-XX:-OmitStackTraceInFastThrow
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/usr/local/graphdb/heapdump.hprof
-XX:OnOutOfMemoryError=kill -9 %p
-Dgraphdb.dist=/usr/local/graphdb
-Xms50g
-Xmx50g
最高输出:
top - 13:32:23 up 22:37, 1 user, load average: 1.00, 0.96, 0.76
Tasks: 153 total, 1 running, 152 sleeping, 0 stopped, 0 zombie
Cpu(s): 25.1%us, 0.2%sy, 0.0%ni, 74.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 65974292k total, 22390544k used, 43583748k free, 109900k buffers
Swap: 8290300k total, 0k used, 8290300k free, 2915740k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4071 sprqlusr 20 0 56.2g 17g 22m S 101.0 28.4 16:53.29 /usr/local/java/bin/java -Xms1g -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djava.net.preferIPv4Stack=true -XX:+UseParallelGC -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpO
这是内存使用页面的截图
答案 0 :(得分:2)
默认情况下,GraphDB将为其全局页面缓存分配50%的可用堆,该结构负责缓存所有磁盘页面并最小化I / O时间。该值在conf / graphdb.properties中由一个以graphdb.page.cache.size开头的行控制。在您的方案中,全局缓存默认设置为25GB。
根据经验,如果所有索引都已打开,您可以计算出具有10亿个RDF语句的存储库将占用大约100GB的磁盘空间。从堆内存使用情况图中,您的数据集看起来不够大,无法填充缓存大小。
对于使用快速SSD磁盘的设置,分配更多缓存大小超过总存储库大小的15-30%几乎没有什么区别。由于GC周期越长,设置更大的堆大小甚至可能会损害repo的性能。我强烈建议您将最大堆大小限制为小于32GB,以便从-XX:+UseCompressedOops
中受益,这应该几乎相当于没有指针压缩的50GB堆大小。此行为与管理big heaps sizes的其他Java应用程序一致。