У нас есть ситуация, когда Kubernetes убивает контейнеры Mongo, когда достигает максимального предела памяти контейнера. Несмотря на то, что ожидается, что K8s будет работать таким образом, но чувствуется, что Mongo не использует повторно свою память, поскольку продолжает увеличивать использование памяти день ото дня, даже если пользовательская загрузка и транзакции одинаковы, поэтому что проверить, как мы можем ограничить Mongo при достижении максимального объема памяти контейнера или регулярной очистке памяти Mongo.
Я попытался увеличить память, которая помогла модулям продолжать работать еще пару дней, прежде чем K8 его убил.
"containers": [
{
"name": "mongo",
"image": "dockercentral.com:5870/com.public/mongodb:3.6",
"ports": [
{
"containerPort": 27017,
"protocol": "TCP"
}
]
"resources": {
"limits": {
"cpu": "1",
"memory": "24Gi"
},
"requests": {
"cpu": "250m",
"memory": "24Gi"
}
}
"name": "MONGO_SECURITY",
"value": "true"
}
],
"resources": {
"limits": {
"cpu": "500m",
"memory": "1Gi"
},
"requests": {
"cpu": "150m",
"memory": "256Mi"
}
},
Версия MongoDB 3.6, значение cacheSizeGB не задано, поскольку оно будет учитывать ограничения памяти контейнера и автоматически выделять кеш wiredTiger. Сейчас я установил wiredTigerCacheSizeGB.. проверю, будет ли это работать
Были некоторые исторические проблемы с надежностью обнаружение памяти контейнера с помощью универсального подхода, поэтому текущая рекомендация — установить wiredTigerCacheSizeGB
явно. Если вы установите wiredTigerCacheSizeGB
аналогично значению по умолчанию (50% доступной оперативной памяти — 1 ГБ), использование памяти должно быть более стабильным. ПРИМЕЧАНИЕ. В ветке разработки MongoDB 4.1.9 реализовано улучшение посредством СЕРВЕР-16571, который был перенесен в предстоящие выпуски серверов 3.6.13 и 4.0.9.
На основании того, что Стенни из MongoDB, Inc. написал в комментарии к вопросу.
у меня работает эта команда в kube.yaml:
command:
- "sh"
- "-c"
- >
echo "storage:" >> /etc/mongod.conf;
echo " wiredTiger:" >> /etc/mongod.conf;
echo " engineConfig:" >> /etc/mongod.conf;
echo " cacheSizeGB: 2" >> /etc/mongod.conf;
echo "replication:" >> /etc/mongod.conf;
echo " replSetName: YOUR_REPL_NAME" >> /etc/mongod.conf;
mongod --config /etc/mongod.conf;
также есть способ установить его во время выполнения:
db.adminCommand( { "setParameter": 1, "wiredTigerEngineRuntimeConfig":"cache_size=2G"})
который также отлично работает, но выглядит проще через yaml-файл kuberneties, потому что для выполнения команды вам нужно подождать, пока mongo не запустится.
ПРИМЕЧАНИЕ: убедитесь, что ваш:
resources:
limits:
memory:
разрешает дополнительный 1G для системы.
установка проводнойTigerCacheSizeGB помогла решить проблему.. спасибо @Stennie.. & user2932688 простите, ребята, за опоздание, я тестировал изменение и ждал некоторое время в производстве, чтобы убедиться, что исправление работает.
@Panda у меня такая же проблема, когда мой модуль mongodb перезагружается, и я предполагаю, что это связано с высоким использованием памяти. но мои контейнеры k8 не имеют ограничений по ресурсам. Мне любопытно, что вы сказали о размере этого wiredTigerCache и работает ли он для вас?
@Kay, да, у меня работал WiredTiger Cache. Интересно, почему у вашего контейнера нет ограничений на ресурсы, это то, что обычно используют для контейнера.
Какую конкретную версию сервера MongoDB вы используете? Вы установили cacheSizeGB (и если да, то какое значение)? Согласно Заметки о производстве MongoDB: если вы запускаете
mongod
в контейнере (например,lxc
,cgroups
, Docker и т. д.), в котором нет имеет доступ ко всей оперативной памяти, доступной в системе, вы должны установить дляstorage.wiredTiger.engineConfig.cacheSizeGB
значение, меньшее, чем объем Оперативная память доступна в контейнере.