今天,我正在针对我们的云MongoDB(Atlas)对Python中的多处理进行压力测试。
它目前正在以100%的速度运行,我想做一些类似“重启”的事情。 我已经找到了“关机”命令,但是在关机后找不到启动它的命令,因此恐怕只运行“关机”。
在下面屏幕的右下部分,我尝试一次杀死一个进程,但是刷新页面后,仍然有相同的进程号,并且我认为列表底部还有更多进程号。我认为他们都已备份。
插入大文档不会在5分钟内返回Python程序。我需要重新启用该功能(应该在过去的10-15秒内进行更新)。
我能够打开命令窗口并连接到该服务器。只是不清楚要运行什么命令。
这是我尝试杀死某些进程的示例:
还请注意,“性能顾问”页面不建议任何新索引。
更新1:
或者,我可以杀死所有正在运行,挂起或锁定的进程吗? 我在此处阅读有关killop的内容:(https://docs.mongodb.com/manual/tutorial/terminate-running-operations/),但发现它与版本以及我使用的是Atlas混淆。
答案 0 :(得分:1)
我不确定是否有更简单的方法,但这就是我所做的。
首先,我运行一个Python程序,根据我的数据库和集合名称提取所有所需的操作ID。您必须查看创建的文件才能了解以下代码中的if语句。注意:它说db.current_op已过时,而且我还没有找到没有该命令(来自PyMongo)如何执行此操作的方法。
请注意,文档页面警告您不要杀死某些类型的操作,因此我小心地选择在一个特定集合中执行插入操作的操作。 (请勿尝试杀死返回的JSON中的所有进程)。
import requests
import os
import sys
import traceback
import pprint
import json
from datetime import datetime as datetime1, timedelta, timezone
import datetime
from time import time
import time as time2
import configHandler
import pymongo
from pymongo import MongoClient
from uuid import UUID
def uuid_convert(o):
if isinstance(o, UUID):
return o.hex
# This get's all my config from a config.json file, not including that code here.
config_dict = configHandler.getConfigVariables()
cluster = MongoClient(config_dict['MONGODB_CONNECTION_STRING_ADMIN'])
db = cluster[config_dict['MONGODB_CLUSTER']]
current_ops = db.current_op(True)
count_ops = 0
for op in current_ops["inprog"]:
count_ops += 1
#db.kill- no such command
if op["type"] == "op":
if "op" in op:
if op["op"] == "insert" and op["command"]["insert"] == "TestCollectionName":
#print(op["opid"], op["command"]["insert"])
print('db.adminCommand({"killOp": 1, "op": ' + str(op["opid"]) + '})')
print("\n\ncount_ops=", count_ops)
currDateTime = datetime.datetime.now()
print("type(current_ops) = ", type(current_ops))
# this dictionary has nested fields
# current_ops_str = json.dumps(current_ops, indent=4)
# https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
filename = "./data/currents_ops" + currDateTime.strftime("%y_%m_%d__%H_%M_%S") + ".json"
with open(filename, "w") as file1:
#file1.write(current_ops_str)
json.dump(current_ops, file1, indent=4, default=uuid_convert)
print("Wrote to filename=", filename)
它将完整的ops文件写入磁盘,但是我将命令窗口中的文件复制/粘贴到了文件中。然后从命令行运行如下代码:
mongo "mongodb+srv://mycluster0.otwxp.mongodb.net/mydbame" --username myuser --password abc1234 <kill_opid_script.js
kill_opid_script.js看起来像这样。我添加了print(db),因为第一次运行它似乎没有任何作用。
print(db)
db.adminCommand({"killOp": 1, "op": 648685})
db.adminCommand({"killOp": 1, "op": 667396})
db.adminCommand({"killOp": 1, "op": 557439})
etc... for 400+ times...
print(db)