<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->

# Health Check Tool

## 1. Overview
The IoTDB Health Check Tool is designed to inspect the runtime environment of IoTDB nodes. It assists users in verifying the node's environment both before deployment and during operation, providing detailed inspection reports.

> IoTDB version requirement: Must not be lower than v1.3.2

## 2. Prerequisites

Linux Systems

* `nc` (netcat) tool: Installed by default; user must have execution permissions.
* `lsof` or `netstat`: At least one must be installed; user must have execution permissions.

> To verify tool installation:
> 
>Check `nc`: `nc -h`
> 
>Check `lsof`: `lsof -v`

Windows Systems

* PowerShell: Enabled by default.

## 3. Inspection Items
* Check port occupancy on the node's server (Windows/Linux).
* Verify port connectivity between the current node and other cluster nodes (Windows/Linux).
* Check JDK installation (JAVA_HOME) (Windows/Linux).
* Inspect system memory allocation and IoTDB memory configuration (Windows/Linux).
* Validate directory access permissions (Windows/Linux).
* Ensure the system's maximum number of open files meets requirements (≥ 65535) (Linux only).
* Confirm swap is disabled (Windows/Linux).

## 4. Usage Instructions
### 4.1 Command Format
```bash
health_check.sh/health_check.bat -ips <Remote_IP+Ports> -o <all(default)/remote/local>
```
### 4.2 Parameter Descriptions

|**Parameter** |**Description**                                                                                               | ​**Required** |
| --------------------- | --------------------------------------------------------------------------------------------------------------------- | ---------------------- |
| `-ips`          | Remote server IPs and ports. Supports multiple servers. Format: `ip port1 port2, ip2 port2-1 port2-2`           | Optional             |
| `-o`            | Scope of check: `local` (local machine), `remote` (remote server ports), `all` (both). Default: `all` | Optional             |


## 5. Usage Examples
### 5.1 Example 1: Check All
```bash
   health_check.sh/health_check.bat -ips 172.20.31.19 6667 18080,10.0.6.230 10311
```   

Output:

```bash
Check: Installation Environment(JDK)
Requirement: JDK Version >=1.8
Result: JDK Version 11.0.21

Check: Installation Environment(Memory)
Requirement: Allocate sufficient memory for IoTDB
Result: Total Memory 7.8Gi, 2.33 G allocated to IoTDB ConfigNode, 3.88 G allocated to IoTDB DataNode

Check: Installation Environment(Directory Access)
Requirement: IoTDB needs write permissions for data/datanode/data, data/datanode/consensus, data/datanode/system, data/datanode/wal, data/confignode/system, data/confignode/consensus, ext/pipe, ext/udf, ext/trigger.
Result:
data/datanode/data has write permission
data/datanode/consensus has write permission
data/datanode/system has write permission
data/datanode/wal has write permission
data/confignode/system has write permission
data/confignode/consensus has write permission
ext/pipe has write permission
ext/udf has write permission
ext/trigger has write permission

Check: Network(Local Port)
Requirement: Ports 16668, 10730, 11742, 10750, 10760, 10710, 10720 must be unoccupied
Result:
Ports 16668, 10730, 11742, 10750, 10760, 10710, 10720 are free

Check: Network(Remote Port Connectivity)
Requirement: 172.20.31.19:6667, 18080 and 10.0.6.230:10311 must be accessible
Result:
Inaccessible server ports:
IP: 10.0.6.230, Ports: 10311

Check: System Settings(Maximum Open Files Number)
Requirement: >= 65535
Result: 65535

Check: System Settings(Swap)
Requirement: Disabled
Result: Disabled.
```

### 5.2 Example 2: Local Check

```bash
health_check.sh/health_check.bat -o local
```

Output:

```bash
Check: Installation Environment(JDK)
Requirement: JDK Version >=1.8
Result: JDK Version 11.0.21

Check: Installation Environment(Memory)
Requirement: Allocate sufficient memory for IoTDB
Result: Total Memory 7.8Gi, 2.33 G allocated to IoTDB ConfigNode, 3.88 G allocated to IoTDB DataNode

Check: Installation Environment(Directory Access)
Requirement: IoTDB needs data/datanode/data,data/datanode/consensus,data/datanode/system,data/datanode/wal,data/confignode/system,data/confignode/consensus,ext/pipe,ext/udf,ext/trigger write permission.
Result: 
data/datanode/data has write permission
data/datanode/consensus has write permission
data/datanode/system has write permission
data/datanode/wal has write permission
data/confignode/system has write permission
data/confignode/consensus has write permission
ext/pipe has write permission
ext/udf has write permission
ext/trigger has write permission

Check: Network(Local Port)
Requirement: Port 16668 10730 11742 10750 10760 10710 10720 is not occupied
Result: 
Port 16668  10730  11742  10750  10760  10710  10720  is free

Check: System Settings(Maximum Open Files Number)
Requirement: >= 65535
Result: 65535

Check: System Settings(Swap)
Requirement: disabled
Result: disabled.
```

### 5.3 Example 3: Remote Check
```bash
health_check.sh/health_check.bat -o remote -ips 172.20.31.19 6667 18080,10.0.6.230 10311
```

Output:

```bash
Check: Network(Remote Port Connectivity)
Requirement: 172.20.31.19:6667, 18080 and 10.0.6.230:10311 must be accessible
Result:
Inaccessible server ports:
IP: 10.0.6.230, Ports: 10311
```

## 6. FAQs
### 6.1 How to Adjust Memory Allocation

* Modify MEMORY\_SIZE in `confignode-env.sh`.
* Modify MEMORY\_SIZE in `datanode-env.sh`.

### 6.2 How to Modify Max Open Files Limit

* To avoid "too many open files" errors:

```bash
# Check current limit
ulimit -n
# Temporarily set
ulimit -n 65535
# Permanently set
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
# Verify after re-login
ulimit -n  # Should return 65535
```

### 6.3 How to Disable Swap and Why
* Why Disable:
IoTDB performance degrades when using swap.

* Steps:

```bash
# Disable swap
echo "vm.swappiness = 0" >> /etc/sysctl.conf
# Clear swap data and reload
swapoff -a && swapon -a
# Apply settings without reboot
sysctl -p
# Verify swap is 0
free -m
```