目錄

簡介

必要條件

需求

採用元件

限制記憶體問題

進一步的問題描述

解決方案

Cisco IOS XR中的XML

使用XML API

XML API支援的作業

提供的XML架構服務

建立查詢

測試XML查詢

思科IOS XR中的XML深入探討

與客戶端的API互動

Cisco IOS XR中的XML錯誤

查詢錯誤時

錯誤型別

更多建議

簡介

本文檔介紹在服務請求和思科工具中看到的XML記憶體限制問題。

必要條件

需求

思科建議您瞭解以下主題：

- Cisco IOS® XR平台

- XML （可延伸標籤語言）基礎架構

- 通用物件要求代理架構(CORBA)

- 元件管理系統(EMS)

- 外部資料管理員(EDM)

採用元件

本文檔中的資訊基於ASR9000。

本文中的資訊是根據特定實驗室環境內的裝置所建立。文中使用到的所有裝置皆從已清除（預設）的組態來啟動。如果您的網路運作中，請確保您瞭解任何指令可能造成的影響。

限制記憶體問題

案件立案時提出以下問題：

1. 路由器上可配置的最大記憶體是多少？

2. 是否有方法可以中斷大型XML回覆？

答案：

1. 最大記憶體更改取決於RSP/節點運行的版本（cXR和eXR的版本）

64位元版本(eXR)。您有一個限制記憶體大小：

RP/0/RSP1/CPU0:XR#show version

Wed Jul 26 21:10:16.761 IST

Cisco IOS XR Software, Version 7.1.3

Copyright (c) 2013-2020 by Cisco Systems, Inc.

Build Information:

Built By     : gopalk2

Built On     : Thu Nov 26 10:51:48 PST 2020

Built Host   : iox-ucs-027

Workspace    : /auto/srcarchive17/prod/7.1.3/asr9k-x64/ws

Version      : 7.1.3

Location     : /opt/cisco/XR/packages/

Label        : 7.1.3

cisco ASR9K () processor

System uptime is 2 weeks 17 hours 22 minutes

RP/0/RSP1/CPU0:XR# configuration

RP/0/RSP1/CPU0:XR(config)#xml agent throttle ?

memory        Memory usage

process-rate  Process rate

RP/0/RSP1/CPU0:XR(config)#xml agent throttle memory ?

<100-1024>  Size of the memory usage in Mbytes per session (default 300 Mbytes)

32位元版本(cXR)。您還有另一個限制：

RP/0/RSP0/CPU0:XR#show version

Cisco IOS XR Software, Version 6.4.2[Default]

Copyright (c) 2020 by Cisco Systems, Inc.

ROM: System Bootstrap, Version 10.59(c) 1994-2014 by Cisco Systems,  Inc.

<snip>

Configuration register on node 0/RSP0/CPU0 is 0x102

Boot device on node 0/RSP0/CPU0 is disk0:

RP/0/RSP0/CPU0:XR# configuration

RP/0/RSP0/CPU0:XR(config)#xml agent throttle memory ?

<100-600>  Size of the memory usage in Mbytes per session (default 300 Mbytes)

注意：任一版本的預設值為300 MB

2. 有多種方法可以中斷XML回覆：

- 迭代器：

設定迭代器時，您會以特定視窗大小區隔XML總回應。視窗具有迭代器大小。例如，如果響應為1 Gb，迭代器大小為500 Mb，則您可以將XML分段為2個應答。

此方法透過增加（基於迭代器大小）GetNext操作（響應需要）來更改響應。

一個會話最多可以有10個迭代器。

- 節流（處理速率）：

此功能會限制XML程式使用的記憶體。如果進程超過記憶體，它會回覆錯誤消息：「The throttle on the memory usage has been reached」。

- 串流：

與「迭代器」類似，「串流」會將XML回應區段到特定視窗。區別在於響應，它會刪除GetNext操作和迭代器ID。XML會傳送串流封裝，當串流結束時，使用者端會建立回應。

進一步的問題描述

對於需要自動化的使用案例，請使用工具pyIOSXR。 此自動化工具是一種XML代理，它有助於發出一些show命令，並整體上連線到裝置。

每次您使用此代理傳送大請求時，都會顯示錯誤：

附註：只有完成註冊的思科使用者能存取思科內部工具與資訊。

RESPONSE ERROR: 0xa367a600 'XML Service Library' detected the 'fatal' condition 'The throttle on the memory usage has been reached. Please optimize the request to query smaller data.'

如果錯誤消息顯示「最佳化查詢較小資料的請求」，則可以使用迭代器配置代理XML API。理論上，這允許將反應進行分段。

設定迭代器時，會顯示相同的錯誤訊息：「RESPONSE ERROR...請最佳化要求以查詢較小的資料」。

當顯示錯誤時，下一步是瞭解為何該功能（本例中為Iterators）不適用於查詢。

pyIOSXR建議您在裝置中正確啟用XML代理，這意味著API不允許使用迭代器。

下一步是測試第二個選項：串流。

注意： pyIOSXR不允許我們處理除具有下列元素的基本XML查詢以外的其他標頭：

<?xml version="1.0" encoding="UTF-8"?>

<Request MajorVersion="1" MinorVersion="0">

<Operation>

.

.

.

</Operation>

</Request>

串流和迭代器會在查詢中新增標頭。串流會加入串流ID，以協助系統建立完整的回應。迭代器增加GET_Next和迭代器ID。

測試串流時也顯示與迭代器相同的錯誤訊息。

解決方案

在More Recommendation to do Queries to the Device一節中，有更多工具可以解決這些問題。萬用字元就是其中之一。萬用字元是記憶體限制的解決方案。

萬用字元會建立特定的查詢，以避免要求不必要的資訊。例如，有關BGP的資訊，請使用show route bgp命令，而不使用通用show route 命令。此範例適用於XML查詢和邏輯。向系統請求批次資訊可能會產生記憶體和處理問題。

打開案例時，使用此查詢：

<?xml version="1.0"  encoding="UTF-8"?>

<Request MajorVersion="1" MinorVersion="0">

<Get>

<Operational>

<BGP  MajorVersion="36" MinorVersion="1">

<InstanceTable>

<Instance>

<Naming>

<InstanceName>

DEFAULT

</InstanceName>

</Naming>

<InstanceActive>

<VRFTable>

<VRF>

<Naming>

<VRFName>

VRF_NAME

</VRFName>

</Naming>

<AFTable>

<AF>

<Naming>

<AFName>

NAME

</AFName>

</Naming>

<NetworkTable>

</NetworkTable>

</AF>

</AFTable>

</VRF>

</VRFTable>

</InstanceActive>

</Instance>

</InstanceTable>

</BGP>>

</Operational>

</Get>

</Request>

此查詢以完整的BGP表為目標。對於此非特定請求，響應幾乎為2.2 Gb，因此已達到記憶體限制限制。

要修復它，需要特定查詢，這樣系統才能處理查詢並返回資訊。

Cisco IOS XR中的XML

注意：如需進一步資訊、規格或其他命令，請按一下下一個連結「XML程式設計手冊：XR XML程式設計手冊」

XML定義如何顯示和建構資料。這是一種分析電腦理解為位並顯示結構化、標準化資訊的方式。

XML具有下列結構：

<init>

<body>

<message>This is an example</message>

</body>

</init>

所有標籤都有兩部分，即開始標籤(<init>)和結束標籤(</init>)。如果未使用此結構，XML將無法瞭解標籤結束的位置。

XML由兩個實體構成：

- 容器

- 枝葉

此結構化資料的一個類比是將XML資料作為樹進行比較。容器是一個分支，每個分支都有樹葉。除資訊外，枝葉不包含任何其他資訊。

例如，下一棵樹的根呈灰色，容器呈白色，枝葉呈藍色。

使用XML API

若要測試/使用XML API，您首先需要的是查詢。

1. 查詢具有標頭：

<?xml version="1.0" encoding="UTF-8”?>

附註：這是唯一不需要結尾標籤的標籤。

2. 您需要為請求增加標籤。在請求中，您需要指定版本。

<Request MajorVersion="1" MinorVersion="0">

3. 使用表頭、請求及版本，主體會繼續API具有的任何下列XML作業：

<Operation>

<Operation_1>

<Operation_2>

…

<Operation_n>

附註：請注意，請求會在每個查詢中包含不同的作業。不必針對每項作業執行要求。

下一個示例顯示一個請求，其中包含所有必需的資訊：

<?xml version="1.0" encoding="UTF-8”?>

<Request MajorVersion="1" MinorVersion="0">

<Operation></Operation>

<Operation_1></Operation_1>

<Operation_2></Operation_2>

…

<Operation_n></Operation_n>

</Request>

XML API支援的作業

Cisco IOS XR支援5個操作，允許使用者與XML架構具有的資訊進行互動：

1. 原生資料作業：

- <Get></Get>：收集行動資料項（枝葉包含的資料）。

- <Set></Set>：配置、更改或增加資料項。

- <Delete></Delete>：消除一個或多個資料項。

- <GetVersionInfo></GetVersionInfo>：檢索所請求元件的主要和次要版本號的操作。

- <GetDataSpaceInfo></GetDataSpaceInfo>：此操作標籤顯示對映到容器的葉名稱。

2. CLI操作：

- <CLI><CLI/>：允許我們發出配置請求作為CLI命令的標籤。

- <GetNext><GetNext/>：如果資料大於塊大小，則此標籤將增加到下一個分段回覆中。

提供的XML架構服務

XML API實作下列名稱空間：

注意：如果需要檢視根對象，請訪問：Cisco IOS-XR XML網路管理。

注意：請注意，每個名稱空間會監督不同的資料和作業。

- 組態：可執行「取得」、「設定」和「刪除」動作的作業。

- 操作：如CLI show命令。

- 動作：支援「設定」動作。透過此操作，您可以存取動作資料，例如clear指令和其他類似指令。

- AdminOperational：存取管理員作業資料。

- AdminAction：存取管理動作資料。

- 管理組態：存取管理組態資料。

建立查詢

有兩條不同的旅行路線。選取查詢的名稱空間之後，您需要使用綱要來處理：

1. XML Schema檔案

這些選項提供顯示容器和枝葉的完整XML樹。對於文檔，請按一下CRS XML Schema。

此時將顯示文檔頁面。

此頁面顯示物件、容器和子件。每個物件都包含一個子物件。如果子物件不包含任何其他容器，則會將其視為分葉。

您可以按一下子項，並顯示用來建立查詢的資訊。例如IPv4：

在上一張圖中，對於任何IPv4查詢，都可以運行針對容器IP、容器Cinetd、容器Services中的配置操作，最後在枝葉IPv4中運行。

附註：任何需要成為分葉才能執行查詢的作業。

查詢是下一個：

<?xml version="1.0"  encoding="UTF-8"?>

<Request MajorVersion="1" MinorVersion="0">

<Get>

<Configurations>

<IP>

<Cinetd>

<Services>

<IPv4/>

</Services>

</Cinetd>

</IP>

</Configurations>

</Get>

</Request>

2. XML API

XML API嵌入在思科IOS XRl中。若要檢視XML樹，請使用show xml schema命令。透過發出命令，可以在類似於Linux的CLI中看到整個XML架構。

在此CLI中，有以下操作：

？：就像— 幫助

LS：列出分支使用者中的容器/枝葉。

<operation>：透過發出？，您可以檢查是否執行操作，然後可以發出以下命令：

某些操作包括：

-設定

- adminconfig

- cd

- 清單

- oper

-動作

CD：變更目錄/容器。

範例顯示下一個：

RP/0/RP0/CPU0:XR#show xml schema

Username:admin

Password:

xml-schema[config]:> ?

config                   oper                     action

adminconfig              adminoper                adminaction

cd                       pwd                      classinfo

list                     ls                       datalist

walk                     walkdata                 get

hierarchy                quit                     exit

help

xml-schema[config]:> ls

[container]                   RIP

[container]                   TCL

[container]                   LawfulIntercept

[container]                   ErrorDisable

[container]                   PerfMgmt

[container]                   RCC

[container]                   FrequencySynchronization

[container]                   HwModuleProfileConfig

[container]                   MPLSStatic

[container]                   XML

[container]                   Tpa

[container]                   MLD

[leaf]                        RPIsolationEnabled

[leaf]                        RPIsolationMultiple

[container]                   AMT

[container]                   PriorityFlowControlWatchdog

[container]                   SSH

[container]                   BNG_PBR

<snip>

警告：請注意，登入裝置需要憑據。這些憑證是裝置的本地憑證，需要root-ls/admin配置檔案。

下一個範例顯示如何使用XML API建立查詢。例如，查詢必須檢查XML代理是否已啟用：

xml-schema[config]:> ls

[container]                   RIP

[container]                   TCL

[container]                   LawfulIntercept

[container]                   ErrorDisable

[container]                   PerfMgmt

[container]                   RCC

[container]                   FrequencySynchronization

[container]                   HwModuleProfileConfig

[container]                   MPLSStatic

[container]                   XML   >>> Here

[container]                   Tpa

[container]                   MLD

[leaf]                        RPIsolationEnabled

[leaf]                        RPIsolationMultiple

[container]                   AMT

[container]                   PriorityFlowControlWatchdog

[container]                   SSH

[container]                   BNG_PBR

[container]                   L2TP

[container]                   Exception

[container]                   IP_RAW

[container]                   MSTAG

[container]                   FpdXRConfig

xml-schema[config]:> cd XML

xml-schema[config]:XML> ls

[container]                   Agent

xml-schema[config]:XML> cd Agent

xml-schema[config]:XML.Agent> ls

[container]                   Default

[container]                   SSL

[container]                   TTY

xml-schema[config]:XML.Agent> cd TTY

xml-schema[config]:XML.Agent.TTY> ls

[leaf]                        Enable   >>> Leaf of interest.

[leaf]                        IterationSize

[leaf]                        StreamingSize

[container]                   Throttle

[container]                   Session

請注意下一個提示：

xml-schema[config]:XML.Agent.TTY>

上一個提示會顯示XML樹狀結構。使用此資訊時，查詢為：

<?xml version="1.0"  encoding="UTF-8"?>

<Request MajorVersion="1" MinorVersion="0">

<Get>

<Configuration>

<XML>

<Agent>

<TTY></TTY>

</Agent>

</XML>

</Configuration>

</Get>

</Request>

測試XML查詢

建立查詢後，下一步就是測試查詢。要測試它，可以在CLI中發出xml echo format命令。此動作可查扣於相同裝置中。

提示：請注意，輸入上述命令後，使用者可以複製/貼上查詢並按Enter鍵。裝置顯示對查詢的響應。

RP/0/RP0/CPU0:XR#xml echo format

XML>

XML> <?xml version="1.0"  encoding="UTF-8"?>

<Request MajorVersion="1" MinorVersion="0">

<Get>

<Configuration>

<XML>

<Agent>

<TTY></TTY>

</Agent>

</XML>

</Configuration>

</Get>

</Request>    >>> Hit enter here. Immediately getting the reply.

! Reply:

<?xml version="1.0" encoding="UTF-8"?>

<Response MajorVersion="1" MinorVersion="0">

<Get>

<Configuration>

<XML MajorVersion="1" MinorVersion="4">

<Agent>

<TTY>

<Enable>

true  >>> This is the requested value.

</Enable>

</TTY>

</Agent>

</XML>

</Configuration>

</Get>

<ResultSummary ErrorCount="0"/>

</Response>

XML> exit

路由器顯示響應和ResultSummary。

注意：此XML響應不顯示，也不要求配置任何限制記憶體。由於未使用任何SSH/TTY，因此無論其大小如何，都需要響應。一個是XML客戶端，另一個是嵌入式XML echo命令，行為可能會改變。

思科IOS XR中的XML深入探討

Cisco IOS XR是需要不同軟體套件才能工作的模組化系統。XML被視為位於管理平面子系統中。

當XR啟動時，有兩種方法可以在裝置中利用XML：

1. CORBA代理（使用SSL）。

2. SSH代理。

注意：CORBA在3.7版之後已被取代。

CORBA作為傳統協定使用SSL，可在安全包中找到。另一方面，SSH方法需要使用Manageability Package。

基礎設施以下列方式分佈：

從上一張圖中，可以看到路由器和交換機處理器(RSP)中的XML主進程。這些進程有一個通用API，用於監視來自裝置中其它進程的所有資訊，這些進程包括：

- 從線卡：

- 統計資料收集器

- 統計伺服器

- 從路由器處理器：

- 統計管理器。

- SysDB。

- TCP (用於XML API的TCP 38751)

- NetIO

注意：要檢視有關此過程的詳細資訊，請檢查Cisco IOS XR中的「XML錯誤」部分。

視請求而定，會觸發一或多個處理。開發自動化工具時，如果響應大於塊大小，則響應無法成功。如果回覆過程需要很長時間，則可能生成EDM日誌、關閉或影響服務。

與客戶端的API互動

下一張圖顯示互動：

要在裝置上配置/啟用XML代理，請使用：

RP/0/RP0/CPU0:XR#config

RP/0/RP0/CPU0:XR(config)#xml agent tty

RP/0/RP0/CPU0:XR(config-xml-tty)#commit

系統需要與客戶在以下方面達成一致：

1. 版本

2. 結構描述

版本可以定義在2個區域中：

- 要求標籤：

<Request Major Version=“1” MinorVersion=“0”>

- 主要元件標籤：

哪一項適用於特定元件：

<BGP MajorVersion=“1” MinorVersion=“0”>

注意：請記住，您可以檢查套用至容器的GetVersionInfo作業之綱要版本。

- 次要版本更新：任何新增至XML綱要的專案，例如新增資料專案。

- 主要版本更新：語意變更、刪除綱要或元件等。

您可以檢查版本。下一個範例顯示如何執行：

附註：XML作業包括GET、SET等。

<?xml version=”1.0” encoding=“UTF-8”?>

<Request Major Version=“1” MinorVersion=“0”>

<GetVersionInfo>

<Operation/>

</GetVersionInfo>

</Request>

使用xml echo formal命令，然後將標籤GetVersionInfo增加到查詢中，以查詢路由器上運行的版本。如下所示：

RP/0/RSP0/CPU0:XR#xml echo format

Mon Jul 31 13:53:50.993 UTC

XML> <?xml version="1.0"  encoding="UTF-8"?>

<Request MajorVersion="1" MinorVersion="0">

<GetVersionInfo>

<Configuration>

<XML>

<Agent>

</Agent>

</XML>

</Configuration>

</GetVersionInfo>

</Request> >>> This is the request

<?xml version="1.0" encoding="UTF-8"?>

<Response MajorVersion="1" MinorVersion="0">

<GetVersionInfo>

<Configuration>

<XML MajorVersion="1" MinorVersion="4">

<Agent>

<Default>

<VRFTable>

<VRF>

<ApplyGroup MajorVersion="2" MinorVersion="3"/>

<ExcludeGroup MajorVersion="2" MinorVersion="3"/>

<ApplyGroupAppend MajorVersion="2" MinorVersion="3"/>

<ApplyGroupRemove MajorVersion="2" MinorVersion="3"/>

</VRF>

</VRFTable>

</Default>

<SSL>

<VRFTable>

<VRF>

<ApplyGroup MajorVersion="2" MinorVersion="3"/>

<ExcludeGroup MajorVersion="2" MinorVersion="3"/>

<ApplyGroupAppend MajorVersion="2" MinorVersion="3"/>

<ApplyGroupRemove MajorVersion="2" MinorVersion="3"/>

</VRF>

</VRFTable>

</SSL>

</Agent>

</XML>

</Configuration>

</GetVersionInfo>

<ResultSummary ErrorCount="0"/>

</Response>

XML>

附註：「請求」會顯示主要元件中的所有執行中版本，也會顯示其容器中的版本。

Cisco IOS XR中的XML錯誤

如果路徑正確，則每個XML API請求都會顯示請求的資訊。

查詢錯誤時

路由器顯示三種不同的消息：

- 找不到itemNotFound

每次GET作業有空白回應時，都會顯示此訊息。

- ItemNotFoundBelow

GET操作在XML架構中不包含此操作。

- 找不到

要求的元素找不到元素層級。

錯誤型別

1. 傳輸：此類別中的錯誤包括XML代理/客戶端通訊之間的任何錯誤。這意味著傳輸中可能會發生任何SSH互動或問題。因此，為了檢查這類問題，建議檢查SSH蹤跡，以檢查任何身份驗證、埠等問題。

2. XML剖析器：格式與語法的任何問題、傳送的回應或查詢中的問題。當發生錯誤時，這些問題通常會傳送失敗原因。

舉例來說：

ERROR: 0xa367a600 'XML Service Library' detected the 'fatal' condition 'The throttle on the memory usage has been reached.

3. XML綱要：與路由器綱要不同的綱要。要解決這些問題，請檢查CLI方案和版本。

舉例來說：

ErrorCode="0x43688400" ErrorMsg="&apos;XMLMDA&apos; detected the &apos;warning&apos; condition &apos;An XML request contains an element which is unrecognised or incorrectly positioned&apos

4. 作業處理：設定裝置時，可能會發生這些問題。若要解決此問題，您需要對進程（例如commit、sysdb等）進行故障排除。

備註：錯誤資訊會新增至作業要素層次。這是以ErrorCode （32位元int）和Errormsg屬性的形式進行編碼。

更多建議

其他實用技術：

1. 萬用字元：也稱為特定查詢。

2. 批處理：在單一請求中結合多項技術或作業（盡力作業）。

3. 自訂篩選：如果綱要允許，可協助選取表格中的資料列。