Boot2Docker Hazelcast и ulimit

Я пытаюсь создать среду разработки для программного обеспечения, которое мы разрабатываем. Для этого я использую Docker и Boot2docker, потому что работаю на Mac (Yosemite). Мы используем Hazelcast в продукте, но у меня возникла проблема, когда я "докеризую" его. При первом подключении к Hazelcast происходит вот что:

INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Hazelcast Community Edition 3.2.2 (20140527) starting at Address[172.17.0.2]:5601
déc. 24, 2014 2:11:27 PM com.hazelcast.system
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Copyright (C) 2008-2014 Hazelcast.com
déc. 24, 2014 2:11:27 PM com.hazelcast.core.LifecycleService
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Address[172.17.0.2]:5601 is STARTING
déc. 24, 2014 2:11:27 PM com.hazelcast.instance.Node
AVERTISSEMENT: [172.17.0.2]:5601 [akio] [3.2.2] No join method is enabled! Starting standalone.
déc. 24, 2014 2:11:27 PM com.hazelcast.core.LifecycleService
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Address[172.17.0.2]:5601 is STARTED
déc. 24, 2014 2:12:30 PM com.hazelcast.nio.SocketAcceptor
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Accepting socket connection from /127.0.0.1:55736
déc. 24, 2014 2:12:30 PM com.hazelcast.nio.TcpIpConnectionManager
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] 5601 accepted socket connection from /127.0.0.1:55736
déc. 24, 2014 2:12:30 PM com.hazelcast.client.AuthenticationRequest
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Received auth from Connection [/127.0.0.1:55736 -> null] live=true, client=true, type=JAVA_CLIENT, successfully authenticated
déc. 24, 2014 2:12:30 PM com.hazelcast.nio.SocketAcceptor
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Accepting socket connection from /172.17.0.2:57088
déc. 24, 2014 2:12:30 PM com.hazelcast.nio.TcpIpConnectionManager
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] 5601 accepted socket connection from /172.17.0.2:57088
déc. 24, 2014 2:12:30 PM com.hazelcast.client.AuthenticationRequest
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Received auth from Connection [/172.17.0.2:57088 -> null] live=true, client=true, type=JAVA_CLIENT, successfully authenticated
déc. 24, 2014 2:12:31 PM com.hazelcast.partition.InternalPartitionService
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Initializing cluster partition table first arrangement...
déc. 24, 2014 2:13:42 PM com.hazelcast.nio.TcpIpConnection
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Connection [Address[172.17.0.2]:57088] lost. Reason: Socket explicitly closed
déc. 24, 2014 2:13:42 PM com.hazelcast.nio.TcpIpConnection
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Connection [Address[127.0.0.1]:55736] lost. Reason: Socket explicitly closed
déc. 24, 2014 2:13:42 PM com.hazelcast.initializer
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Destroying node initializer.
déc. 24, 2014 2:13:42 PM com.hazelcast.instance.Node
INFOS: [172.17.0.2]:5601 [akio] [3.2.2] Hazelcast Shutdown is completed in 111 ms.
java.lang.OutOfMemoryError: unable to create new native thread
déc. 24, 2014 2:13:42 PM com.hazelcast.concurrent.lock.operations.LockOperation
GRAVE: [172.17.0.2]:5601 [akio] [3.2.2] unable to create new native thread
java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:714)
    at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949)
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1360)
    at com.hazelcast.spi.impl.BasicInvocation$InvocationFuture.runAsynchronous(BasicInvocation.java:617)
    at com.hazelcast.spi.impl.BasicInvocation$InvocationFuture.set(BasicInvocation.java:668)
    at com.hazelcast.spi.impl.BasicInvocation.notify(BasicInvocation.java:303)
    at com.hazelcast.spi.impl.BasicPartitionInvocation.notify(BasicPartitionInvocation.java:28)
    at com.hazelcast.spi.impl.ResponseHandlerFactory$LocalInvocationResponseHandler.sendResponse(ResponseHandlerFactory.java:144)
    at com.hazelcast.spi.impl.BasicOperationService.processOperation(BasicOperationService.java:385)
    at com.hazelcast.spi.impl.BasicOperationService.access$300(BasicOperationService.java:102)
    at com.hazelcast.spi.impl.BasicOperationService$BasicOperationProcessorImpl.process(BasicOperationService.java:754)
    at com.hazelcast.spi.impl.BasicOperationScheduler$PartitionThread.process(BasicOperationScheduler.java:276)
    at com.hazelcast.spi.impl.BasicOperationScheduler$PartitionThread.doRun(BasicOperationScheduler.java:270)
    at com.hazelcast.spi.impl.BasicOperationScheduler$PartitionThread.run(BasicOperationScheduler.java:245)

déc. 24, 2014 2:13:42 PM com.hazelcast.spi.OperationService
AVERTISSEMENT: [172.17.0.2]:5601 [akio] [3.2.2] While sending op error... op: com.hazelcast.concurrent.lock.operations.LockOperation@4ff5ed2a, error: java.lang.OutOfMemoryError: unable to create new native thread
com.hazelcast.spi.exception.ResponseAlreadySentException: NormalResponse already sent for callback: BasicInvocation{ serviceName='hz:impl:lockService', op=com.hazelcast.concurrent.lock.operations.LockOperation@4ff5ed2a, partitionId=50, replicaIndex=0, tryCount=100, tryPauseMillis=500, invokeCount=1, callTimeout=10000, target=Address[172.17.0.2]:5601}, current-response: : com.hazelcast.core.HazelcastInstanceNotActiveException: Hazelcast instance is not active!
    at com.hazelcast.spi.impl.ResponseHandlerFactory$LocalInvocationResponseHandler.sendResponse(ResponseHandlerFactory.java:141)
    at com.hazelcast.spi.impl.BasicOperationService.handleOperationError(BasicOperationService.java:531)
    at com.hazelcast.spi.impl.BasicOperationService.processOperation(BasicOperationService.java:404)
    at com.hazelcast.spi.impl.BasicOperationService.access$300(BasicOperationService.java:102)
    at com.hazelcast.spi.impl.BasicOperationService$BasicOperationProcessorImpl.process(BasicOperationService.java:754)
    at com.hazelcast.spi.impl.BasicOperationScheduler$PartitionThread.process(BasicOperationScheduler.java:276)
    at com.hazelcast.spi.impl.BasicOperationScheduler$PartitionThread.doRun(BasicOperationScheduler.java:270)
    at com.hazelcast.spi.impl.BasicOperationScheduler$PartitionThread.run(BasicOperationScheduler.java:245)

После поиска в Google эта ошибка может быть вызвана граничным процессом, которым может управлять пользователь. После моего исследования следует использовать «ulimit -u» на хосте (Boot2Docker), но он не предлагает эту опцию.

Кто-то уже сталкивался с проблемой? Если это так, вы можете обойти это?

PS: Хост Docker = окончательная версия Java CentOS 6.6 "1.7.0_60" Hazelcast = 3.2.2


person Ben    schedule 24.12.2014    source источник
comment
Актуально ли исключение нехватки памяти? java.lang.OutOfMemoryError: невозможно создать новый собственный поток   -  person Usman Ismail    schedule 24.12.2014
comment
На самом деле, это единственная найденная мной подсказка, объясняющая остановку службы.   -  person Ben    schedule 26.12.2014


Ответы (1)


Я не уверен, что не предлагает опцию «ulimit -u», но обычно вы запускаете ее в оболочке Linux. Вы должны настроить мягкое и жесткое ограничение для открытых файлов внутри контейнера докера и, возможно, также на хост-компьютере. Сам никогда не пользовался докером, но это обычная проблема Linux, никаких докеров, не специфичных для Hazelcast.

person noctarius    schedule 24.12.2014
comment
С докером ограничения должны быть установлены на хосте (невозможно сделать в самом контейнере). Docker изначально не работает под Mac и должен запускаться из boot2docker (VM на базе Tiny Core Linux). Но ulimit в boot2docker не предлагает параметр -u для установки максимального количества потоков на пользователя. - person Ben; 26.12.2014