REST API NetWorker: Время ожидания HTTP-запросов GET периодически истекает
Summary: Для запроса информации (HTTP GET) с сервера NetWorker в среде используется программный интерфейс (API) NetWorker representational state transfer (REST). Время ожидания запросов REST API периодически истекает, и в restapi.log отображается внутренняя ошибка сервера из-за истечения времени ожидания сокета. ...
Symptoms
Для запроса информации (HTTP GET) от сервера NetWorker в среде используется программный интерфейс (API) NetWorker Representational State Transfer (REST). Время ожидания запросов REST API периодически истекает, и в restapi.log отображается внутренняя ошибка сервера из-за истечения времени ожидания сокета.
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]
Команда curl в программном интерфейсе REST API сервера NetWorker отображает следующее:
[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
REST API вызывает «v3/global/backups", "v3/global/jobs", или "v3/global/volumes» являются ресурсоемкими запросами и могут привести к истечению времени ожидания запроса в более крупных средах.
Сервисы NetWorker REST API размещаются в контейнере Java-сервлетов Apache Tomcat, который работает на виртуальной машине Java (JVM). REST API использует память JVM для обработки каждого запроса, и было показано, что не вся память освобождается после ресурсоемкого запроса. Увеличение использования памяти JVM может в конечном итоге привести к истечению времени ожидания других, менее ресурсоемких запросов REST API.
Resolution
Избегайте использования ресурсоемких запросов для получения информации от сервера NetWorker. Например, команда «v3/global/backups" или "v3/global/clients/CLIENT_NUMBER/backups" с определенным диапазоном времени можно использовать вместо использования глобального "v3/global/backups», чтобы извлечь все резервные копии.
Например, ограничьте результаты для saveTime любым указанным диапазоном времени. Пример запроса для задач, которые были завершены в течение последних 24 часов:
../global/backups Пример:
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 Пример:
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
Сведения о вызовах NetWorker API см. в руководстве разработчика REST API, «query list filter» (q) и "фильтр списка полей" (fl) параметры.
Отладка REST API определена в: NetWorker. Включение отладки
по API-интерфейсу RESTВ качестве альтернативы можно использовать следующее тестирование:
Используйте следующие параметры в команде REST API:
| Параметр | Назначение |
--max-time 3600 |
Устанавливает жесткое ограничение в 3600 секунд (1 час) для всей передачи (DNS, подключение, TLS, текст запроса и ответа). Если вся операция не будет завершена в течение 1 часа, curl остановится с ошибкой тайм-аута. |
--connect-timeout 60 |
Ограничивает время, отведенное на установление подключения TCP/TLS, 60 секундами. Если curl не может подключиться в течение 60 секунд, эта попытка не будет выполнена. Если параметр --retry включен, можно повторить попытку (в соответствии с приведенными ниже правилами повторной попытки). Это значение можно изменить по своему усмотрению. |
--retry 3 |
Предписывает curl повторить попытку до трех раз при временных сбоях. Это значение можно изменить по своему усмотрению. Типичные триггеры повторной попытки:
|
--retry-delay 5 |
Задает фиксированное время ожидания в 5 секунд между попытками повторения. После кратковременного сбоя curl ожидает 5 секунд перед следующей попыткой. Это значение можно изменить по своему усмотрению. |
-H "X-NW-AUTHC-BASE-URL:REMOTE_AUTHC_SERVER_ADDRESS:9090" |
(По желанию.) Это требуется только в том случае, если хост NetWorker, используемый для обработки запросов на вход, отделен от сервера NetWorker в конечной точке API REST. См. NetWorker REST API. Как использовать удаленный сервер AUTHC при обработке запросов RESTAPI |
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 является параметром для PowerShell ConvertTo-Json . Он определяет, сколько уровней вложенных объектов и массивов включается, когда PowerShell сериализует данные в JSON. Количество вложенных объектов (если таковые имеются) может варьироваться в зависимости от используемой конечной точки API REST и потенциального «фильтра списка запросов» (q) или "фильтр списка полей" (fl) используемых параметров. 20 должно быть более чем достаточно для вызовов NetWorker REST API.
В приведенном выше примере создан объект
volumes.json в каталоге, из которого curl.exe был запущен. Содержимое файла включает полезные данные REST API:
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
Пример (без -v для краткости):
[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
В этом примере файл "volumes.json» был создан в том же каталоге, из которого была выполнена команда.
Для правильного анализа форматирования json можно использовать различные инструменты, используемые инструменты могут различаться в зависимости от ОС и установленного программного обеспечения.
[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
}
}
]
}