py脚本解决ArcGIS Server服务内存过大的问题
在一台服务器上,使用ArcGIS Server发布地图服务,但是地图服务较多,在发布之后,服务器的内存持续处在95%上下的高位状态,导致服务器运行状态不稳定,经常需要重新启动。重新启动后重新进入这种内存高位的陷阱。
1. 现象
打开任务管理器发现大量ArcSOC.exe
进程,这些进程CPU使用率不高,但基本都在50-90m之间,直接占用绝大部分的内存资源。
2. 解决方法
我们打开ArcMap,从右侧ArcCatlog中找到发布的ArcGIS Server服务名称,然后右键选择“服务属性”,如下图所示:
在弹出的服务编辑器中,选择“池化”,将每台机器的最小实例数修改成0,如下图所示:
重启服务即可
3. 在浏览器中打开
4. 代码批量修改
从2、3中我们可以看到,无非就是修改这些属性,通过接口的调用,动态修改。以下为python代码,以下代码使用的python3.
4.1. 代码内容
# Demonstrates how to modify the min and max instances for a service
# For Http calls
import http.client, urllib, json,requests
# For system tools
import sys
# For reading passwords without echoing
import getpass# Defines the entry point into the script
def main(argv=None):# Print some infoprintprint("This tool is a sample script that resets the minimum and maximum instances allowed for a service.")printserverName ="127.0.01" #raw_input("Enter Server name: ")serverPort = 6080username ="arcgis" #raw_input("Enter user name: ")password ="arcgis" #getpass.getpass("Enter password: ")minInstances =0 #raw_input("Enter the new minimum: ")maxInstances =2 #raw_input("Enter the new maximum: ")# Check to make sure the minimum and maximum are numericaltry:minInstancesNum = int(minInstances)maxInstancesNum = int(maxInstances)except ValueError:print("Numerical value not entered for minimum, maximum, or both.")return# Check to make sure that the minimum is not greater than the maximumif minInstancesNum > maxInstancesNum:print("Maximum number of instances must be greater or equal to minimum number.")return# Get a tokentoken = getToken(username, password, serverName, serverPort)if token == "":print("Could not generate a token with the username and password provided.")returnservice_names=getAllServer(token)for index, service in enumerate(service_names):print(f"{index}/{len(service_names)}:开始修改服务{service}...")AlterServerPerNode(serverName, serverPort,token,service,minInstancesNum,maxInstancesNum)print(f"服务{service}修改完成")# A function to generate a token given username, password and the adminURL.
def getToken(username, password, serverName, serverPort):# Token URL is typically http://server[:port]/arcgis/admin/generateTokentokenURL = "/arcgis/tokens/generateToken"params = urllib.parse.urlencode({'username': username, 'password': password, 'client': 'requestip', 'f': 'json'})headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}# Connect to URL and post parametershttpConn = http.client.HTTPConnection(serverName, serverPort)httpConn.request("POST", tokenURL, params, headers)# Read responseresponse = httpConn.getresponse()if (response.status != 200):httpConn.close()print("Error while fetching tokens from admin URL. Please check the URL and try again.")returnelse:data = response.read()httpConn.close()# Check that data returned is not an error objectif not assertJsonSuccess(data): return# Extract the token from ittoken = json.loads(data) return token['token'] def getAllServer(serverName, serverPort,token):service_names = []service_base_url = f"{serverName}:{serverPort}/arcgis/admin/services"# This request only needs the token and the response formatting parameterparams = urllib.parse.urlencode({'token': token, 'f': 'json'})serviceURL=service_base_url+"?"+paramsresponse=requests.get(serviceURL)# httpConn.request("Post", serviceURL, params, headers)# Read responseif (response.status_code == 200):#data = response.json()data = json.loads(response.text)if "folders" in data:for folder in data["folders"]:service_base_folder_url =f"{service_base_url}/{folder}"folder_url = service_base_folder_url+"?"+params# folder_url = urllib.parse.quote(folder_url, safe='/:')folder_response = requests.get(folder_url)folder_data = json.loads(folder_response.text)for service in folder_data["services"]:if(service["type"]=="MapServer"):service_names.append(f"{folder}/{service['serviceName']}")# if "folders" in data:for service in data["services"]:if(service["type"]=="MapServer"):service_names.append(service['serviceName'])return service_namesdef AlterServerPerNode(serverName, serverPort,token,service,minInstancesNum,maxInstancesNum):service=service+".MapServer"serviceURL = urllib.parse.quote("/arcgis/admin/services/" + service, safe='/:')# This request only needs the token and the response formatting parameterparams = urllib.parse.urlencode({'token': token, 'f': 'json'})headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}# Connect to service to get its current JSON definition httpConn = http.client.HTTPConnection(serverName, serverPort)httpConn.request("POST", serviceURL, params, headers)# Read responseresponse = httpConn.getresponse()if (response.status != 200):httpConn.close()print("Could not read service information.")returnelse:data = response.read()# Check that data returned is not an error objectif not assertJsonSuccess(data): print("Error when reading service information. " + str(data))else:print("Service information read successfully. Now changing properties...")# Deserialize response into Python objectdataObj = json.loads(data)if dataObj["minInstancesPerNode"]!=minInstancesNum or dataObj["maxInstancesPerNode"] != maxInstancesNum:# Edit desired properties of the servicedataObj["minInstancesPerNode"] = minInstancesNumdataObj["maxInstancesPerNode"] = maxInstancesNum# Serialize back into JSONupdatedSvcJson = json.dumps(dataObj)# Call the edit operation on the service. Pass in modified JSON.editSvcURL = urllib.parse.quote("/arcgis/admin/services/" + service + "/edit", safe='/:')params = urllib.parse.urlencode({'token': token, 'f': 'json', 'service': updatedSvcJson})httpConn.request("POST", editSvcURL, params, headers)# Read service edit responseeditResponse = httpConn.getresponse()if (editResponse.status != 200):httpConn.close()print("Error while executing edit.")returnelse:editData = editResponse.read()# Check that data returned is not an error objectif not assertJsonSuccess(editData):print("Error returned while editing service" + str(editData)) else:print("Service edited successfully.")httpConn.close() return# A function that checks that the input JSON object
# is not an error object.
def assertJsonSuccess(data):obj = json.loads(data)if 'status' in obj and obj['status'] == "error":print("Error: JSON object returns an error. " + str(obj))return Falseelse:return True# Script start
if __name__ == "__main__":sys.exit(main(sys.argv[1:]))
4.2. 代码解读
-
导入模块:
http.client
、urllib
、json
、requests
:用于处理 HTTP 请求和 JSON 数据的模块。sys
:用于处理命令行参数和退出脚本的模块。getpass
:用于安全地输入密码而不回显的模块。
-
定义
main
函数:main
函数是脚本的入口点,它负责执行主要的操作。- 打印一些信息,包括脚本的描述。
- 获取服务器名称、端口、用户名、密码、最小实例数和最大实例数等输入参数。
- 检查输入参数的有效性,并确保最小实例数不大于最大实例数。
- 获取令牌(Token):调用
getToken
函数,使用提供的用户名和密码获取 ArcGIS Server 的令牌。令牌用于身份验证。 - 获取所有服务列表:调用
getAllServer
函数,获取 ArcGIS Server 上所有的服务名称。
-
定义
getToken
函数:getToken
函数用于获取 ArcGIS Server 的令牌(Token),以便进行身份验证。- 构建令牌请求的 URL 和参数。
- 发送 HTTP POST 请求以获取令牌。
- 解析响应并提取令牌。
-
定义
getAllServer
函数:getAllServer
函数用于获取 ArcGIS Server 上的所有服务的名称。- 构建服务列表请求的 URL 和参数。
- 发送 HTTP GET 请求以获取服务列表。
- 解析响应并提取服务名称,存储在
service_names
列表中。
-
定义
AlterServerPerNode
函数:AlterServerPerNode
函数用于修改指定服务的最小和最大实例数量。- 构建修改服务属性的请求 URL 和参数。
- 发送 HTTP POST 请求以修改服务属性。
- 检查响应以确保修改成功。
-
定义
assertJsonSuccess
函数:assertJsonSuccess
函数用于检查 JSON 响应是否包含错误信息。- 如果 JSON 响应包含错误信息,函数返回
False
,否则返回True
。
-
在脚本的末尾,使用
if __name__ == "__main__":
来指示当脚本作为主程序运行时执行main
函数。
参考资源
示例:编辑服务属性—ArcGIS Server | ArcGIS Enterprise 文档
ArcGIS Server服务中ArcSOC进程占用过多内存-百度经验 (baidu.com)
相关文章:

py脚本解决ArcGIS Server服务内存过大的问题
在一台服务器上,使用ArcGIS Server发布地图服务,但是地图服务较多,在发布之后,服务器的内存持续处在95%上下的高位状态,导致服务器运行状态不稳定,经常需要重新启动。重新启动后重新进入这种内存高位的陷阱…...
Go语言Web开发入门指南
Go语言Web开发入门指南 欢迎来到Go语言的Web开发入门指南。Go语言因其出色的性能和并发支持而成为Web开发的热门选择。在本篇文章中,我们将介绍如何使用Go语言构建简单的Web应用程序,包括路由、模板、数据库连接和静态文件服务。 准备工作 在开始之前…...

保姆级教程——VSCode如何在Mac上配置C++的运行环境
vscode官方下载: 点击官网链接,下载对应的pkg,安装打开; https://code.visualstudio.com/插件安装 点击箭头所指插件商店按钮,yyds; 下载C/C 插件; 
Qt开发_调用OpenCV(3.4.7)设计完成人脸检测系统
一、前言 近年来,人脸识别技术得到了广泛的应用,它可以在各种场景中实现自动化的人脸检测和识别,例如安防监控、人脸解锁、人脸支付等。 该项目的目标是设计一个简单易用但功能强大的人脸检测系统,可以实时从摄像头采集视频,并对视频中的人脸进行准确的检测和框选。通过…...
Java 中 List 删除元素
fori循环 删除某个元素后,list的大小发生了变化,会导致遍历准确。 这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用 增强for循环 删除元素后继续循环会报错误信息ConcurrentModificationException,但是…...

Redis:StringRedisTemplate简介
(笔记总结自b站黑马程序员课程) 为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。 为了减少内存的消耗,我们可以采用手动序列化的方式&am…...

pytorch-神经网络-手写数字分类任务
Mnist分类任务: 网络基本构建与训练方法,常用函数解析 torch.nn.functional模块 nn.Module模块 读取Mnist数据集 会自动进行下载 %matplotlib inlinefrom pathlib import Path import requestsDATA_PATH Path("data") PATH DATA_PATH / &…...

【群智能算法改进】一种改进的鹈鹕优化算法 IPOA算法[1]【Matlab代码#57】
文章目录 【获取资源请见文章第5节:资源获取】1. 原始POA算法2. 改进后的IPOA算法2.1 Sine映射种群初始化2.2 融合改进的正余弦策略2.3 Levy飞行策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节:资源获取】 1. 原始POA算法 此…...

C++初阶:C++入门
目录 一.iostream文件 二.命名空间 2.1.命名空间的定义 2.2.命名空间的使用 三.C的输入输出 四.缺省参数 4.1.缺省参数概念 4.2.缺省参数分类 4.3.缺省参数注意事项 4.4.缺省参数用途 五.函数重载 5.1.重载函数概念 5.2.C支持函数重载的原理--名字修饰(name Mangl…...
golang操作数据库--gorm框架、redis
目录 1.数据库相关操作(1)非orm框架①引入②初始化③增删改查 (2) io版orm框架 (推荐用这个)①引入②初始化③增删改查④gorm gen的使用 (3) jinzhu版orm框架①引入②初始化③增删改查 2.redis(1)引入(2)初始化①普通初始化②v8初始化③get/set示例 1.数据库相关操作 (1)非orm…...
10 种常用的字符串方法
10 种常用的字符串方法 1.concat() 字符串拼接 const str1 12345678;const str2 abcdefgh;const str3 -【】;‘;console.log(str1.concat(str2,str3))//12345678abcdefgh-【】;‘ 2.includes() 判断字符串中是否包含指定值,返回布尔值…...
CSDN每日一练 |『生命进化书』『订班服』『c++难题-大数加法』2023-09-06
CSDN每日一练 |『生命进化书』『订班服』『c++难题-大数加法』2023-09-06 一、题目名称:生命进化书二、题目名称:订班服三、题目名称:c++难题-大数加法一、题目名称:生命进化书 时间限制:1000ms内存限制:256M 题目描述: 小A有一本生命进化书,以一个树形结构记载了所有生…...

echarts饼图label自定义样式
生成的options {"tooltip": {"trigger": "item","axisPointer": {"type": "shadow"},"backgroundColor": "rgba(9, 24, 48, 0.5)","borderColor": "rgba(255,255,255,0.4)&q…...

Unity汉化一个插件 制作插件汉化工具
我是编程一个菜鸟,英语又不好,有的插件非常牛!我想学一学,页面全是英文,完全不知所措,我该怎么办啊...尝试在Unity中汉化一个插件 效果: 思路: 如何在Unity中把一个自己喜欢的插件…...

从过滤器初识责任链设计模式
下面用的过滤器都是注解方式 可以使用非注解方式,就是去web.xml配置映射关系 上面程序的执行输出是 再加一个过滤器 下面来看一段程序 输出结果 和过滤器是否非常相识 但是上面这段程序存在的问题:在编译阶段已经完全确定了调用关系,如果你想改变他们的调用顺序或者继续添加一…...

Redis7安装配置
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏…...

切分支解决切不走因为未合并的路径如何解决
改代码的时候改做分支了,本来是在另一个分支上面改代码,结果改到另一个放置上面,然后想着使用git stash进行保存,然后切到另外一个分支再pop,结果不行。 报这个错误,导致切不过去,因为我这边pop…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...

ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...