iServer性能提升介绍

作者:doremi

GIS服务器很多时候都会存在着高并发的请求,而SuperMap iServer也提供了相应的负载均衡方法,集群以及多进程多实例,让GIS服务器的高并发,高性能方面得到很大的提升。下面将介绍这两种方法的特点以及应用场景。
####集群

集群体系中包含以下角色,不同的角色通过各自不同的操作来构建整个集群体系:
集群父节点:即集群服务器,是集群服务的提供者,负责监听和协调子节点的服务器,可以通过使用集群中的使用本地集群服务实现对外提供 GIS 服务,通过配置集群查看和控制子节点的加入;
集群子节点:,执行父节点分配的任务,可以通过加入集群向集群父节点报告,成为集群体系的一员;
GIS 应用服务器:客户端直接访问的 GIS 服务器,如果是由集群父节点兼任,则使用方式同集群父节点,如果是独立的服务器,则可以通过使用集群中的使用其他集群服务实现对外提供 GIS 服务.

这里写图片描述

集群子节点加入集群后,会每隔2秒向父节点报告一次,集群父节点收到报告后,认为该子节点是可用的子节点,且该子节点会出现在集群服务器的“集群成员列表”中。当客户端或 GIS 应用服务器向集群服务器(父节点)发送请求时,集群服务器会基于负载均衡原则将任务分配给各个集群成员(子节点),如下图所示。集群成员响应请求并将响应的结果返回给集群服务器,集群服务器再将收到的响应结果返回给发送请求的客户端或 GIS 应用服务器。例如客户端浏览地图时,收到的地图切片可能来自不同的集群成员,而不是仅来自客户端请求的集群服务器。在以下情况集群服务器会判定集群成员超时,不会给该成员分配任务或将已分配的请求任务转发给其他节点处理:
如果集群成员超过2秒未向集群服务器报告,即连接超时,则集群服务器会认为该成员无效;
如果集群成员响应请求的时间超过2分钟,即响应超时,则集群服务器会认为该成员响应超时,会将请求转发给其他节点处理。
这里写图片描述

使用集群

GIS 应用服务器是为客户端直接提供 GIS 服务的服务端,通过使用集群可以提升 GIS 服务的性能和负载量,集群系统将以本机 GIS 应用服务器为出口向客户端提供高性能的服务。
GIS 应用服务器使用集群的方式有以下两种:

  • 使用本地集群服务,如图1所示,即集群的父节点作为 GIS 应用服务器对外提供服务,客户端可以直接访问集群父节点;
  • 使用其他集群服务,如图2所示,即 GIS 应用服务器本身不属于集群服务的一部分,它的作用是接收客户端请求,并转发给集群服务器父节点处理,本身只起到转发请求的作用。
    这里写图片描述这里写图片描述

配置集群
多个 GIS 服务器可以通过搭建集群,提高性能。默认情况下,SuperMap iServer 的 GIS 服务器均开启集群功能,随时可以接受子节点加入。
这里写图片描述
集群父节点即集群服务器,其主要职责是监听和协调子节点执行相关任务,可以对整个集群系统进行安全控制,可以查看集群成员(子节点)并决定是否允许其加入集群。集群父节点可以“开启”安全控制,来控制子节点的加入。
这里写图片描述

受控集群
SuperMap iServer 支持子节点以受控的方式加入集群。这种集群配置方式简单快速,适合于子节点空闲的情况,子节点本身不需要对外提供服务而可以接受父节点的控制。子节点一旦开启了受控集群,就要受到父节点的完全控制,其自身原有的服务实例和服务管理器都将被禁用,父节点的服务实例和数据将同步到子节点。其中,服务组件集合对应的服务实例、空间处理服务将被过滤不同步到子节点。
子节点作为受控模式的集群成员,仅用于处理父节点转发的请求
这里写图片描述
如上图所示,在一个集群体系中,可以同时存在受控的子节点(标识2)和非受控子节点(标识3)。
子节点开启受控集群后,父节点会自动将服务和相应的数据同步到子节点上,这样子节点就具有与父节点相同的服务,父节点就能把客户端请求转发给子节点处理。
集群可以配置单机集群和多机集群,如果服务器的硬件性能很好或者说是没有更多的服务器的时候可以配置单机集群,单机集群需要注意的是,保证父节点、各个子节点分布使用不同的端口。以 SuperMap iServer 在 windows 平台的 ZIP 产品包为例,两个产品包之间配置集群时,需要保证不同产品包中的 Tomcat 使用不同的端口。修改 zip 包中 Tomcat 的端口号方法为修改%SuperMap iServer_HOME%/conf/server.xml 中的相关端口,如:<Server port=“8016” ……>、<Connector port=“8091” …… redirectPort=“8454” ……>。

####单机多进程
单个进程不能充分利用系统 CPU、内存等系统资源,而 GIS 服务因海量数据、计算密集等特点,对性能的要求较高,因此对于并行计算、多进程的需求强烈。为了充分利用系统资源,以前我们可以通过配置单机集群来实现在一个系统中启用多个 iServer 提供服务。其中涉及手工修改端口号等操作,较为繁琐。
目前,iServer 提供了可视化的单机多进程配置来协助您在一个操作系统上快速地创建多个 iServer 进程。您只需要启动多进程,iServer 即可根据您指定的进程数自动创建、启动多个进程。此外,通过 iServer 多进程架构,您可以将每一份数据对应的服务部署独立的 worker 中,从而实现不同服务在进程间的隔离。

多进程架构
iServer 多进程架构中有一个 Master 和多个 Worker,以及用以监控 Master 避免其失效的 Daemon 角色。
这里写图片描述

  • Master 是 iServer 的主进程,负责启动、协调、管理当前系统中的所有节点即 Worker。您启动 iServer 中的多进程后,当前 iServer 会自动被识别为 Master 节点。为保证主节点的可用性,Master 本身节点不负责处理具体的业务逻辑,如不提供 GIS 服务,不参与分布式切图。
  • Worker 是由 Master 启动和管理的多个 iServer 进程,一个 Worker 对应一个端口的 iServer 进程,可以支持服务发布、GIS 请求处理,以及参与分布式切图。
  • Daemon 是 iServer 的监控进程,负责监控、启动 Master 节点,避免 Master 节点失效。启动一个 iServer 时 Daemon 进程自动启动,您无需配置、管理该进程。

配置使用多进程
启用多进程

  • 启用多进程意味着:当前操作系统中的iServer从单个进程变为多个进程,而禁用多进程则意味着从多个iServer进程变为单个进程。
    这里写图片描述

  • 根据您的系统配置设置 Worker 进程数(建议该 Worker 数与 CPU 核数相等,以获得最佳性能),默认为2

  • 根据您的网络状况,设置 Worker 进程的端口范围,默认为8900-9000,则 Worker 端口从8900开始依次增大
    **注意:**在多进程配置页面,启用或禁用多进程后,您都需要重启iServer才能生效。

动态增加子节点

Server 多进程的节点数支持动态伸缩,您可以根据系统情况和使用需求随时增加或减少节点。
完成修改后,您可以在多进程页面查看当前正在运行的 Worker 子节点。

管理多进程的 GIS 服务

启用多进程以后,原 iServer 变成多进程的 iServer Master 节点,Master 则在在新增的 Worker 节点中自动部署 iServer 原有的 GIS 服务。由 Master 来管理由 Master 主节点来统一管理 Worker,包括各 Worker 的服务管理、安全管理、服务监控、访问统计、日志查看等。也就是说,您只需要在 Master 节点上,即可统一管理各个 Worker 上的所有 GIS 服务,您可以:

  • 在 Master 节点的“服务列表”页面统一访问服务,虽然访问服务的地址还是原 iServer 的地址,但访问具体的服务时,Master 会将请求映射给相应的子节点
  • 在 Master 节点的“服务管理”页面统一管理服务
  • 在 Master 节点的服务管理器中发布服务,Master 会根据负载自动把服务部署在某一个 Worker 中
  • 在 Master 节点的“安全”模块统一管理用户账户等权限控制信息,安全配置对所有 Worker 都适用且您不会感受到 Worker 的存在
  • 在 Master 节点的“监控与统计”模块监控所有服务的访问状态、统计服务访问数据等
    总之,启用多进程以后,虽然自动启动了多个 iServer 进程,但是您不需要对每个 iServer 单独管理。您只需要像以前管理单个 iServer 那样,通过原端口的 Master 节点即可统一管理所有 Worker 中的服务。

配置多服务实例

iServer 多进程模式支持多服务实例,您可以动态设置服务实例个数,即为服务分配Worker数量。例如您设置某个服务的实例个数为n,则该服务将会被分配至n个Worker中,并由这些Worker处理该服务的请求。您可以通过以下几种方式配置多实例:

通过服务管理器配置多服务实例

发布工作空间为GIS服务时,启用多实例的方式:

  • 发布工作空间时,勾选“启用多进程”,并设置实例数量。依照发布工作空间步骤继续配置即可。启用多实例后,如果不设置实例数量,则默认与Worker数量一致。
  • 对于已发布的工作空间,可在 Master 节点的“服务管理”页面,服务提供者配置中启用多实例。当该工作空间发布了两种及以上类型的服务时,此方式不可用。

修改实例数量方式包括以下两种方式。同时,对于其他来源的GIS服务,无需手动启用多实例,可直接通过如下方式修改实例数量:

  • 在 Master 节点的“服务管理”页面设置服务实例个数。进入“服务管理”页面,在“基本信息”中修改“实例数量”,保存即可。
  • 在 Master 节点的“服务组件”页面设置服务实例个数。进入“服务组件”配置页面,在“基本配置”中修改“实例数量”,保存即可。

通过XML文件配置多服务实例
如果您通过XML文件配置服务,可在服务提供者配置中增加参数以开启多实例,在服务组件配置中设置实例数量。具体如下:

  • 在服务提供者配置中增加true,开启多实例,例如:
<provider class="com.supermap.services.providers.UGCMapProvider"  enabled="true" name="map-World">  
      <config class="com.supermap.services.providers.UGCMapProviderSetting">  
         <workspacePath>E:/supermap_iserver_801_4/samples/data/World/World.sxwu</workspacePath>  
          <multiThread>true</multiThread>  
          <poolSize>0</poolSize>  
          <ugcMapSettings/>  
          <useCompactCache>false</useCompactCache>  
          <extractCacheToFile>true</extractCacheToFile>  
          <queryExpectCount>1000</queryExpectCount>  
          <ignoreHashcodeWhenUseCache>false</ignoreHashcodeWhenUseCache>  
          <cacheDisabled>false</cacheDisabled>  
          <isMultiInstance>true</isMultiInstance>  
       </config>  
    </provider>  

如服务来源不为工作空间时,则无需上述参数。
• 在服务组件配置中,通过修改instanceCount的值,修改服务实例数量。

    <component class="com.supermap.services.components.impl.MapImpl"  enabled="true" instanceCount="3" interfaceNames="rest" 
 name="map-World" providers="map-World">  
      <config class="com.supermap.services.components.MapConfig">  
          <useCache>true</useCache>  
          <useUTFGridCache>true</useUTFGridCache>  
          <useVectorTileCache>true</useVectorTileCache>  
          <expired>0</expired>  
          <cacheReadOnly>false</cacheReadOnly>  
      </config>  
    </component>

使用以上方式修改服务实例数量后,您可以进入“多进程”页面进行查看。此外,如果您设置的实例数量多于Worker的数量,将默认和Worker数量相同,该服务将会分配至所有Worker中。
配置实例个数的优势体现在资源的合理分配,例如对于资源消耗高的服务,多配置实例,使其得到更多资源,包括CPU、内存、网络带宽等。从而有效提升资源利用率,同时也优化了服务访问效率。

使用场景
随着硬件技术的发展,一般计算机都是多核配置,都可以通过使用多进程的 iServer 来提高资源利用率。具体说来,以下场景可以较好地发挥多进程优势:

  • GIS 服务数量较多,且对应多个工作空间数据。
    因 iServer 多进程划分服务时会把数据来源为同一工作空间的服务部署在一个 Worker 中,因此数据来源较多时使用多进程可以有效隔离不同数据的服务。
  • 分布式切图。
    iServer 启用多进程后,所有 Worker 节点均作为切图节点自动参与分布式切图,因此可大大提升单机切图的效率。
    依照传统方式进行分布式切图,如通过集群搭建的分布式切图环境,集群父节点需要向子节点中推送任务数据。
    而基于多进程创建分布式切图任务,对于只读的数据文件,如只读的 UDB 数据源、SMTiles 文件等,集群的父节点只需推送一份任务数据至子节点中的指定位置,子节点的各个 Worker 在切图时从该位置获取数据即可。
    随着切图任务的数量增加,需要推送的数据也在增加。为保证切图效率,每个Worker 节点都参与切图,节点之间并不存在明显差异,因此基于该方式,您可以对推送的数据进行统一管理。
    而对于单机多进程模式下进行分布式切图,无需推送任务数据,worker 节点切图时可直接从 Master 获取数据,从而节省了数据推送时间,提升切图效率。
    注意事项
    多进程架构默认采用了8900-9000端口,用于启动HTTP服务,请确认这些端口不被占用,否则将不能正常使用多进程。

采用多实例后的性能提升效果
这里写图片描述

总结

以上两种方法需要客户根据自身的条件来进行选择。理论上来讲,多机的集群方式一般要比单机的集群方式效果更好。如果有多台服务器可用,可以采用多机集群(需要多个许可);如果没有足够的硬件设备的支持,可以采用单机集群(只需一个许可)或者多进程多实例的方式,但单机方式我们更推荐多进程多实例来使用。

[编辑本段]Turbo C2.0    介绍      Turbo C2.0不仅是一个快捷、高效的编译程序,同时还有一个易学、易用的集成开发环境。使用Turbo C2.0无需独立地编辑、编译和连接程序,就能建立并运行C语言程序。因为这些功能都组合在Turbo 2.0的集成开发环境内,并且可以通过一个简单的主屏幕使用这些功能。    基本配置要求   Turbo C 2.0可运行于IBM-PC系列微机,包括XT,AT及IBM 兼容机。此时要求DOS2.0或更高版本支持,并至少需要448K的RAM,可在任何彩、单色80列监视器上运行。支持数学协处理器芯片,也可进行浮点仿真,这将加快程序的执行。 [编辑本段]Turbo C 2.0的主要文件的简单介绍   INSTALL.EXE 安装程序文件   TC.EXE 集成编译   TCINST.EXE 集成开发环境的配置设置程序   TCHELP.TCH 帮助文件   THELP.COM 读取TCHELP.TCH的驻留程序README 关于Turbo C的信息文件   TCCONFIG.EXE 配置文件转换程序MAKE.EXE   项目管理工具TCC.EXE   命令行编译TLINK.EXE   Turbo C系列连接器TLIB.EXE   Turbo C系列库管理工具C0?.OBJ 不   同模式启动代码C?.LIB   不同模式运行库GRAPHICS.LIB   图形库EMU.LIB   8087仿真库FP87.LIB 8087库   *.H Turbo C头文件   *.BGI 不同显示器图形驱动程序   *.C Turbo C例行程序(源文件)   其中:上面的?分别为:T Tiny(微型模式)S Small(小模式)C Compact(紧凑模式)M Medium(中型模式)L Large(大模式)H Huge(巨大模式)    Turbo C++ 3.0   “Turbo C++ 3.0”软件是Borland公司在1992年推出的强大的——C语言程序设计与C++面向对象程序设计 的集成开发工具。它只需要修改一个设置选项,就能够在同一个IDE集成开发环境下设计和编译以标准 C 和 C++ 语法设计的程序文件。 [编辑本段]C 语言   C语言起始于1968年发表的CPL语言,它的许多重要思想都来自于Martin Richards在1969年研制的BCPL语言,以及以BCPL语言为基础的与Ken Thompson在1970年研制的B语言。Ken Thompson用B语言写了第一个UNIX操作系统。M.M.Ritchie1972年在B语言的基础上研制了C语言,并用C语言写成了第一个在PDP-11计算机上研制的UNIX操作系统。1977年出现了独立于极其的C语言编译文本《看移植C语言编译程序》,从而大大简化了把C语言编译程序移植到新环境中所做的工作,这本身也就使UNIX的日益广泛使用,C语言也迅速得到推广。   1983年美国国家标准化协会(ANSI)根据C语言问世以来的各种版本,对C语言的发展和扩充制定了新的标准,成为ANSI C。1987年ANSI又公布了新标准————87ANSI C。   目前在微型计算机上使用的有Microsoft C、Quick C、Turbo C等多种版本。这些不同的C语言版本,基本部分是相同的,但是在有关规定上有略有差异。   C 语言发展如此迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的功能。许多著名的系统软件, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 语言编写的。用C 语言加上一些汇编语言子程序, 就更能显示C 语言的优势了,象PC- DOS ,WORDSTAR等就是用这种方法编写的。归纳起来C 语言具有下列特点:   1. C是中级语言   它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。   2. C是结构式语言   结构式语言的显著特点是代码及数据的分隔化, 即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。C 语言是以函数形式提供给用户的, 这些函数可方便的调用, 并具有多种循环、条件语句控制程序流向, 从而使程序完全结构化。   3. C语言功能齐全   C 语言具有各种各样的数据类型, 并引入了指针概念, 可使程序效率更高。另外C 语言也具有强大的图形功能, 支持多种显示器和驱动器。而且计算功能、逻辑判断功能也比较强大, 可以实现决策目的。   4. C语言适用范围大   C 语言还有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于多种机型。   C语言的优点很多,但是也存在一些缺点,如运算优先级太多,运算能力方面不像其它高级语言那样强,语法定义不严格等。但是这些都不能阻止C语言成为一门广受欢迎的计算机编程语言
Turbo C2.0 介绍   Turbo C2.0不仅是一个快捷、高效的编译程序,同时还有一个易学、易用的集成开发环境。使用Turbo C2.0无需独立地编辑、编译和连接程序,就能建立并运行C语言程序。因为这些功能都组合在Turbo 2.0的集成开发环境内,并且可以通过一个简单的主屏幕使用这些功能。 基本配置要求   Turbo C 2.0可运行于IBM-PC系列微机,包括XT,AT及IBM 兼容机。此时要求DOS2.0或更高版本支持,并至少需要448K的RAM,可在任何彩、单色80列监视器上运行。支持数学协处理器芯片,也可进行浮点仿真,这将加快程序的执行。 主要文件的简单介绍   INSTALL.EXE 安装程序文件   TC.EXE 集成编译   TCINST.EXE 集成开发环境的配置设置程序   TCHELP.TCH 帮助文件   THELP.COM 读取TCHELP.TCH的驻留程序README 关于Turbo C的信息文件   TCCONFIG.EXE 配置文件转换程序MAKE.EXE   项目管理工具TCC.EXE   命令行编译TLINK.EXE   Turbo C系列连接器TLIB.EXE   Turbo C系列库管理工具C0?.OBJ 不   同模式启动代码C?.LIB   不同模式运行库GRAPHICS.LIB   图形库EMU.LIB   8087仿真库FP87.LIB 8087库   *.H Turbo C头文件   *.BGI 不同显示器图形驱动程序   *.C Turbo C例行程序(源文件)   其中:上面的?分别为:T Tiny(微型模式)S Small(小模式)C Compact(紧凑模式)M Medium(中型模式)L Large(大模式)H Huge(巨大模式)
### 回答1: 在 TURBO C 2.0 中,您可以使用 biosdisk() 函数来格式化软盘。 下面是一段代码示例: ``` #include <stdio.h> #include <dos.h> int main() { // 定义扇区的大小 unsigned int sector_size[3] = {512, 512, 1024}; // 定义填充字节 unsigned char fill_char[3] = {0xF6, 0xF6, 0x48}; // 格式化磁道 700 的前三个扇区 for (int i = 0; i < 3; i++) { int result = biosdisk(2, 0, 70, 0, i + 1, 1, sector_size[i], fill_char[i]); if (result != 0) { printf("格式化扇区 %d 失败,返回码: %d\n", i + 1, result); } } return 0; } ``` 请注意,在使用 biosdisk() 函数之前,需要包含 dos.h 头文件。 希望这能帮到您! ### 回答2使用TURBO C 2.0语言,可以通过以下代码格式化软盘的70磁道0面,并分别格式化3个扇区,大小分别为512字节、512字节和1024字节。其中,前两个扇区使用F6填充,第三个扇区使用48填充。 ```c #include<stdlib.h> #include<stdio.h> #include<dos.h> void formatFloppyDisk(){ union REGS regs; regs.h.ah = 0x0;// To format a floppy disk, we set AH=0 regs.h.dl = 0;// Drive number (0=A, 1=B, etc.) regs.x.cx = 0;// Track number to format regs.h.dh = 0;// Head number regs.h.al = 0;// Sector size (0=default, 1=512 bytes, 2=1024 bytes, 3=2048 bytes etc.) int FILL_BYTE = 0;// The byte value to fill the sectors with during formatting int NUM_SECTORS = 3;// Number of sectors to format // To format 70th track 0th head regs.x.ax = 0x1301; // 0x13 = Reset disk system, 01H = Reset only specified drive int86(0x13, &regs, &regs); // BIOS interrupt to reset disk system for (int i=0; i<NUM_SECTORS; i++){ regs.x.ax = 0x3101; // 0x31 = Write Format, 01H = Format only current track regs.x.bx = 0x0001; // 0x00 = Drive A:, 01H = Head 1, 0 = Generate ID Field depending on the disk in the drive 1 = Keep the ID Field all zeros regs.x.cx = 0x0170; // Track number=70(0-79 range) regs.h.dh = 0x00; // Head number=0 or 1 regs.h.al = 0x02; // Control byte=always zero regs.x.dx = i+1; // Sector number starting from 1 regs.x.si = 0x0000; // segment and offset of read/write buffer regs.x.di = 0x0000; // segment and offset of result if(i == 2){ FILL_BYTE = 0x48; // Fill the third sector with 48 regs.x.ax = 0x3102; // 0x31 = Write Format, 02H = Format sequential tracks immediately following the one being formatted }else{ FILL_BYTE = 0xF6; // Fill the first two sectors with F6 } regs.h.ah = FILL_BYTE; // Fill the sector with specified byte int86(0x13, &regs, &regs); // BIOS interrupt to format the specified sector } } int main(){ formatFloppyDisk(); return 0; } ``` 上述代码使用了INT 0x13,即BIOS中断服务例程,来执行软盘格式化操作。通过设置寄存器的不同参数,可以指定要格式化的磁道、面、扇区大小和填充字节。在这个例子中,我们格式化了软盘70磁道0面的3个扇区,前两个扇区使用F6填充,第三个扇区使用48填充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值