Container / Technology · 2022年11月18日

Docker问题之shared_memory

最近在跑一个程序的时候,在Docker中跑总是出错,但放到普通Linux VM上却没有问题。

虽然报出的错指向了shared_ptr,但问题一定是出在使用shared_ptr之前。

/boost_1_79_0/boost/smart_ptr/shared_ptr.hpp:786: typename boost::detail::sp_member_access<T>::type boost::shared_ptr<T>::operator->() const [with T = SSL_MANAGEMENT_SYS; typename boost::detail::sp_member_access<T>::type = SSL_MANAGEMENT_SYS*]: Assertion `px != 0′ failed.

于是debug,定位到代码使用boost::shared_ptr去创建一块新的内存时,抛出异常:

boost::interprocess::interprocess_exception => No space left on device

现在再来看问题已经指向得很明确了,但当时我的第一感觉是使用Docker创建的Container分到的内存不足。

其实shared_ptr要创建的内存,是shared_memory。

而shared_memory的大小,是靠/dev/shm来定义的。默认下,docker环境里的shared_memory只有64M:

在程序需要大量shared_memory时,很明显就不够用了。

解决办法很简单,给出shm_size的参数即可。以docker-compose为例,只需要加入:

shm_size: ‘4gb’

问题解决。