NetWorker-REST-API: Zeitweise Timeouts bei HTTP GET-Anforderungen
Summary: Die Anwendungsprogrammschnittstelle (API) von NetWorker Representational State Transfer (REST) wird verwendet, um Informationen (HTTP GET) von einem NetWorker-Server in der Umgebung anzufordern. Bei den REST API-Abfragen tritt gelegentlich ein Timeout auf und der restapi.log zeigt aufgrund eines Socket-Timeouts eine interne Serverfehlermeldung an. ...
Symptoms
Die Anwendungsprogrammschnittstelle (API) von NetWorker Representational State Transfer (REST) wird verwendet, um Informationen (HTTP GET) von einem NetWorker-Server in der Umgebung anzufordern. Bei den REST API-Abfragen tritt gelegentlich ein Timeout auf und der restapi.log zeigt aufgrund eines Socket-Timeouts eine interne Serverfehlermeldung an.
YYYY-MM-DD HH:MM:SS INFO [https-jsse-nio-9090-exec-26] c.e.n.w.WebApiResponse - Response status Method: 'GET', URI:'v3/global/backups', Status '200'
YYYY-MM-DD HH:MM:SS INFO [https-jsse-nio-9090-exec-26] c.e.n.w.WebApiResponse - Response status Method: 'GET', URI:'v3/global/backups', Status '500'
...
YYYY-MM-DD HH:MM:SS ERROR [https-jsse-nio-9090-exec-11] c.e.n.w.WebApiExceptionMapper - Status 'Internal Server Error', msg: java.io.IOException: Broken pipe
org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:333) ~[catalina.jar:9.0.10]
Ein curl-Befehl für die NetWorker-Server-REST-API zeigt Folgendes an:
[root@NetworkerServer]# curl -X GET -H "Content-Type: application/json" "https://mynsr.mydomain.com:9090/nwrestapi/v3/global/backups" -u "administrator" -k -1
Enter host password for user 'administrator':
curl: (28) Operation timed out after 300406 milliseconds with 0 out of 0 bytes received
Cause
Die REST API ruft "v3/global/backups", "v3/global/jobs" oder "v3/global/volumes" allein sind ressourcenintensive Abfragen und können in größeren Umgebungen zu einem Timeout der Anforderung führen.
Die NetWorker-REST-API-Services werden auf einem Apache Tomcat-Java-Servlet-Container gehostet, der auf einer Java Virtual Machine (JVM) ausgeführt wird. Die REST API verwendet JVM-Speicher, um jede Anforderung zu verarbeiten, und es hat sich gezeigt, dass nicht der gesamte Speicher nach einer ressourcenintensiven Abfrage freigegeben wird. Die Erhöhung der JVM-Speicherauslastung kann schließlich zu einem Timeout bei anderen, weniger ressourcenintensiven REST API-Anforderungen führen.
Resolution
Vermeiden Sie die Verwendung ressourcenintensiver Anfragen zum Abrufen von Informationen vom NetWorker-Server. Beispiel: "v3/global/backups" oder "v3/global/clients/CLIENT_NUMBER/backups" mit einem definierten Zeitbereich anstelle der globalen "v3/global/backups", um alle Backups abzurufen.
Beschränken Sie beispielsweise die Ergebnisse für saveTime zwischen einem beliebigen angegebenen Zeitraum. Beispiel für eine Abfrage von Jobs, die innerhalb der letzten 24 Stunden abgeschlossen wurden:
../global/backups Beispiel:
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/backups?q=saveTime:["START" TO "END"]
https://nsr.amer.lan:9090/nwrestapi/v3/global/backups?q=saveTime:["2024-07-24T00:00:01" TO "2024-07-24T23:59:59"]
../global/clients/client_resourceId_number/backups
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/clients/client_resourceID_number/backups?q=saveTime:["START" TO "END"]
https://nsr.amer.lan:9090/nwrestapi/v3/global/clients/87.0.90.20.0.0.0.0.196.80.99.102.192.168.9.150/backups?q=saveTime:["2024-07-24T00:00:01" TO "2024-07-24T23:59:59"]
../global/jobs:
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/jobs?q=endTime:["START" TO "END"]
https://nsr.amer.lan:9090/nwrestapi/v3/global/jobs?q=endTime:["2024-07-29T00:00:01" TO "2024-07-29T23:59:59"]
../global/volumes Beispiel:
https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/volumes?q=type:"MEDIA_TYPE"&fl=location,name,mode,pool,written
https://nsr.amer.lan:9090/nwrestapi/v3/global/volumes?q=type:"Data Domain"&fl=location,name,mode,pool,written
Additional Information
Weitere Informationen zu NetWorker-API-Aufrufen finden Sie im REST API-Entwicklerhandbuch unter "Abfragelistenfilter" (q) und "Feldlistenfilter" (fl) eingestellt.
REST-API-Debugging ist definiert in: NetWorker: So aktivieren Sie das REST-API-Debugging
Alternativ können die folgenden Tests verwendet werden:
Verwenden Sie die folgenden Optionen im REST API-Befehl:
| Option | Zweck |
--max-time 3600 |
Legt eine feste Obergrenze von 3.600 Sekunden (1 Stunde) für die gesamte Übertragung fest (DNS, Verbindung, TLS, Anforderungs- und Antworttext). Wenn der gesamte Vorgang nicht innerhalb von 1 Stunde abgeschlossen ist, wird curl mit einem Timeout-Fehler beendet. |
--connect-timeout 60 |
Begrenzt die Zeit für den Aufbau der TCP/TLS-Verbindung auf 60 Sekunden. Wenn curl nicht innerhalb von 60 Sekunden eine Verbindung herstellen kann, schlägt dieser Versuch fehl. Wenn --retry aktiviert ist, kann der Vorgang erneut durchgeführt werden (vorbehaltlich der folgenden Wiederholungsregeln). Dieser Wert kann nach eigenem Ermessen geändert werden. |
--retry 3 |
Weist curl an, es bei vorübergehenden Fehlern bis zu dreimal zu wiederholen. Dieser Wert kann nach eigenem Ermessen geändert werden. Typische Wiederholungsauslöser:
|
--retry-delay 5 |
Legt eine feste Wartezeit von 5 Sekunden zwischen Wiederholungsversuchen fest. Nach einem vorübergehenden Fehler wartet curl 5 Sekunden vor dem nächsten Versuch. Dieser Wert kann nach eigenem Ermessen geändert werden. |
-H "X-NW-AUTHC-BASE-URL:REMOTE_AUTHC_SERVER_ADDRESS:9090" |
(Optional.) Dies ist nur erforderlich, wenn der NetWorker-Host, der zur Verarbeitung von Anmeldeanforderungen verwendet wird, vom NetWorker-Server im REST API-Endpunkt getrennt ist. Siehe: NetWorker REST API: So verwenden Sie einen Remote-AUTHC-Server bei der Verarbeitung von RESTAPI-Anforderungen |
Windows Powershell:
curl.exe -k -v --compressed ` --max-time 3600 ` --connect-timeout 60 ` --retry 3 ` --retry-delay 5 ` -u NETWORKER_USERNAME:'PASSWORD' ` -H "Accept: application/json" ` "https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/volumes/ENDPOINT" ` | ConvertFrom-Json ` | ConvertTo-Json -Depth 20 ` | Out-File -Encoding UTF8 OUTPUT_FILE_NAME
-Depth 20 ist ein Parameter für PowerShell's ConvertTo-Json cmdlet. Es steuert, wie viele Ebenen von geschachtelten Objekten und Arrays enthalten sind, wenn PowerShell Ihre Daten in JSON serialisiert. Die Anzahl der verschachtelten Objekte (wenn überhaupt) kann je nach verwendetem REST API-Endpunkt und potenziellem "Abfragelistenfilter" (q) oder "Feldlistenfilter" (fl) verwendeten Parametern. 20 sollte für NetWorker-REST-API-Aufrufe mehr als ausreichend sein.
Im obigen Beispiel wurde die
volumes.json Datei in dem Verzeichnis, aus dem curl.exe ausgeführt wurde. Der Inhalt der Datei umfasst die REST API-Payload:
Linux:
curl -k -v --compressed \ --max-time 3600 \ --connect-timeout 60 \ --retry 3 \ --retry-all-errors \ --retry-delay 5 \ -u NETWORKER_USERNAME:'PASSWORD' \ -H "Accept: application/json" \ "https://NETWORKER_SERVER_ADDRESS:9090/nwrestapi/v3/global/volumes/ENDPOINT" \ -o volumes.json
Beispiel (ohne -v Der Kürze halber):
[root@nsr ~]# curl -k --compressed \
--max-time 3600 \
--connect-timeout 60 \
--retry 3 \
--retry-all-errors \
--retry-delay 5 \
-u Administrator:'!Password1' \
-H "Accept: application/json" \
"https://nsr.amer.lan:9090/nwrestapi/v3/global/volumes?q=type%3A%22Data%20Domain%22&fl=location,name,mode,pool,written" \
-o volumes.json
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 908 0 908 0 0 22700 0 --:--:-- --:--:-- --:--:-- 22146
In diesem Beispiel wird die Datei "volumes.json" wurde in demselben Verzeichnis erstellt, in dem der Befehl ausgeführt wurde.
Verschiedene Tools können verwendet werden, um die JSON-Formatierung korrekt zu analysieren, die verwendeten Tools können je nach installiertem Betriebssystem und installierter Software variieren.
[root@nsr ~]# cat volumes.json | python -m json.tool
{
"count": 6,
"volumes": [
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "nsr.amer.lan.dddefault.001",
"pool": "Data Domain Default",
"written": {
"unit": "KB",
"value": 429
}
},
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "nsr.amer.lan.dddefault.002",
"pool": "Data Domain Default",
"written": {
"unit": "KB",
"value": 25917027
}
},
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "VMBackupPool.001",
"pool": "VMBackupPool",
"written": {
"unit": "KB",
"value": 209818962
}
},
{
"location": "ddve01.amer.lan",
"mode": "Appendable",
"name": "VMBackupPool.002",
"pool": "VMBackupPool",
"written": {
"unit": "KB",
"value": 2308309500
}
},
{
"location": "ddve02.amer.lan",
"mode": "Appendable",
"name": "nsr.amer.lan_c.dddefault.001",
"pool": "Data Domain Default Clone",
"written": {
"unit": "KB",
"value": 36752
}
},
{
"location": "ddve02.amer.lan",
"mode": "Appendable",
"name": "VMClonePool.001",
"pool": "VMClonePool",
"written": {
"unit": "KB",
"value": 0
}
}
]
}