压测准备

测试机器

  • 2vCPUs | 4GB | s6.large.2 CentOS 7.6 64bit

    建立测试库

create database test_db 
character set utf8mb4 collate utf8mb4_bin;

下载sysbench

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
sysbench --version
sysbench 1.0.19  

准备测试表

sysbench 
//基于mysql的驱动去连接mysql数据库
--db-driver=mysql 
//连续访问300秒
--time=300 
//10个线程模拟并发访问
--threads=10 
//每隔1秒输出一下压测情况
--report-interval=1 
//本机
--mysql-host=127.0.0.1 
//端口号:3306
--mysql-port=3306 
//测试用户
--mysql-user=root 
//测试密码
--mysql-password=******* 
//测试数据库
--mysql-db=test_db 
//模拟新建20个表
--tables=20 
//100万条数据 执行oltp数据库的读写测试
--table_size=1000000 oltp_read_write 
//参照这个命令的设置去构造出来我们需要的数据库里的数据
//自动创建20个测试表,每个表里创建100万条测试数据
--db-ps-mode=disable prepare

执行命令之后:

Initializing worker threads...                                                                                                             
                                                                                                                                           
Creating table 'sbtest9'...                                                                                                                
Creating table 'sbtest1'...                                                                                                                
Creating table 'sbtest4'...                                                                                                                
Creating table 'sbtest2'...                                                                                                                
Creating table 'sbtest5'...                                                                                                                
Creating table 'sbtest7'...                                                                                                                
Creating table 'sbtest6'...
Creating table 'sbtest3'...
Creating table 'sbtest8'...
Creating table 'sbtest10'...
Inserting 1000000 records into 'sbtest9'
Inserting 1000000 records into 'sbtest4'
Inserting 1000000 records into 'sbtest5'
Inserting 1000000 records into 'sbtest8'
Inserting 1000000 records into 'sbtest6'
Inserting 1000000 records into 'sbtest2'
Inserting 1000000 records into 'sbtest7'
Inserting 1000000 records into 'sbtest1'
Inserting 1000000 records into 'sbtest10'
Inserting 1000000 records into 'sbtest3'

测试指标

thds: 10 tps: 489.10 qps: 9735.09 (r/w/o: 6817.46/1939.42/978.21) lat (ms,95%): 62.19 err/s: 0.00 reconn/s: 0.00
  • thds 压测线程数
  • tps 每秒事务数
  • qps 每秒请求数
  • (r/w/o) 每秒的请求数中读请求个数/写请求个数/其他请求个数
  • lat(ms,95%) 95% 的请求延迟都在多少以下
  • err/s 错误数
  • reconn/s 重连数
SQL statistics:
    queries performed:
        read:                            1785882
        write:                           510252
        other:                           255126
        total:                           2551260
    transactions:                        127563 (425.09 per sec.)
    queries:                             2551260 (8501.77 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0839s
    total number of events:              127563

Latency (ms):
         min:                                    4.24
         avg:                                   23.52
         max:                                 1087.40
         95th percentile:                       69.29
         sum:                              2999819.79

Threads fairness:
    events (avg/stddev):           12756.3000/52.74
    execution time (avg/stddev):   299.9820/0.00
  • 300s内执行了178万读请求,50万写请求,25万其他请求,总共执行了255万请求。
  • 总共执行事务12万,每秒425次事务
  • 总共执行255万次请求,每秒8500次请求
  • 总用时:300s,127563次事务
  • 延迟最小 4.24ms
  • 平均请求 23.52ms
  • 延迟最大 1087ms
  • 95% 的请求延迟在69ms

开始测试

综合TPS,oltp_read_write

测试命令

sysbench –db-driver=mysql –time=300 –threads=10 –report-interval=1 –mysql-host=127.0.0.1 –mysql-port=3306 –mysql-user=root –mysql-password=’******’ –mysql-db=test_db –tables=20 –table_size=1000000 oltp_read_write –db-ps-mode=disable run

测试数据

[ 261s ] thds: 10 tps: 489.10 qps: 9735.09 (r/w/o: 6817.46/1939.42/978.21) lat (ms,95%): 62.19 err/s: 0.00 reconn/s: 0.00
[ 262s ] thds: 10 tps: 398.03 qps: 8034.62 (r/w/o: 5613.43/1625.12/796.06) lat (ms,95%): 74.46 err/s: 0.00 reconn/s: 0.00
[ 263s ] thds: 10 tps: 325.93 qps: 6459.53 (r/w/o: 4532.97/1275.71/650.85) lat (ms,95%): 150.29 err/s: 0.00 reconn/s: 0.00
[ 264s ] thds: 10 tps: 499.17 qps: 9961.43 (r/w/o: 6975.40/1986.68/999.34) lat (ms,95%): 51.94 err/s: 0.00 reconn/s: 0.00
[ 265s ] thds: 10 tps: 431.96 qps: 8644.16 (r/w/o: 6038.42/1741.83/863.92) lat (ms,95%): 68.05 err/s: 0.00 reconn/s: 0.00
[ 266s ] thds: 10 tps: 433.91 qps: 8723.24 (r/w/o: 6108.77/1747.65/866.83) lat (ms,95%): 78.60 err/s: 0.00 reconn/s: 0.00
[ 267s ] thds: 10 tps: 450.07 qps: 8997.40 (r/w/o: 6302.98/1793.28/901.14) lat (ms,95%): 64.47 err/s: 0.00 reconn/s: 0.00

测试结果

SQL statistics:
    queries performed:
        read:                            1785882
        write:                           510252
        other:                           255126
        total:                           2551260
    transactions:                        127563 (425.09 per sec.)
    queries:                             2551260 (8501.77 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0839s
    total number of events:              127563

Latency (ms):
         min:                                    4.24
         avg:                                   23.52
         max:                                 1087.40
         95th percentile:                       69.29
         sum:                              2999819.79

Threads fairness:
    events (avg/stddev):           12756.3000/52.74
    execution time (avg/stddev):   299.9820/0.00

只读性能,oltp_read_only

测试命令

sysbench –db-driver=mysql –time=300 –threads=10 –report-interval=1 –mysql-host=127.0.0.1 –mysql-port=3306 –mysql-user=root –mysql-password=’******’ –mysql-db=test_db –tables=20 –table_size=1000000 oltp_read_only –db-ps-mode=disable run

测试数据

[ 199s ] thds: 10 tps: 867.92 qps: 13910.67 (r/w/o: 12174.84/0.00/1735.83) lat (ms,95%): 13.95 err/s: 0.00 reconn/s: 0.00
[ 200s ] thds: 10 tps: 907.19 qps: 14500.97 (r/w/o: 12686.60/0.00/1814.37) lat (ms,95%): 14.46 err/s: 0.00 reconn/s: 0.00
[ 201s ] thds: 10 tps: 913.33 qps: 14610.29 (r/w/o: 12783.63/0.00/1826.66) lat (ms,95%): 14.46 err/s: 0.00 reconn/s: 0.00
[ 202s ] thds: 10 tps: 904.80 qps: 14486.87 (r/w/o: 12677.26/0.00/1809.61) lat (ms,95%): 14.21 err/s: 0.00 reconn/s: 0.00
[ 203s ] thds: 10 tps: 895.75 qps: 14329.00 (r/w/o: 12537.50/0.00/1791.50) lat (ms,95%): 12.75 err/s: 0.00 reconn/s: 0.00
[ 204s ] thds: 10 tps: 920.16 qps: 14715.57 (r/w/o: 12877.25/0.00/1838.32) lat (ms,95%): 12.52 err/s: 0.00 reconn/s: 0.00
[ 205s ] thds: 10 tps: 913.00 qps: 14635.93 (r/w/o: 12807.94/0.00/1827.99) lat (ms,95%): 14.21 err/s: 0.00 reconn/s: 0.00
[ 206s ] thds: 10 tps: 908.77 qps: 14509.38 (r/w/o: 12692.83/0.00/1816.55) lat (ms,95%): 14.21 err/s: 0.00 reconn/s: 0.00

测试结果

SQL statistics:
    queries performed:
        read:                            3682476
        write:                           0
        other:                           526068
        total:                           4208544
    transactions:                        263034 (876.75 per sec.)
    queries:                             4208544 (14027.94 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0102s
    total number of events:              263034

Latency (ms):
         min:                                    1.66
         avg:                                   11.40
         max:                                  183.17
         95th percentile:                       15.27
         sum:                              2999435.93

Threads fairness:
    events (avg/stddev):           26303.4000/298.92
    execution time (avg/stddev):   299.9436/0.00

删除性能,oltp_delete

测试命令

sysbench –db-driver=mysql –time=300 –threads=10 –report-interval=1 –mysql-host=127.0.0.1 –mysql-port=3306 –mysql-user=root –mysql-password=’******’ –mysql-db=test_db –tables=20 –table_size=1000000 oltp_delete –db-ps-mode=disable run

测试数据

[ 183s ] thds: 10 tps: 3732.66 qps: 3732.66 (r/w/o: 0.00/1143.90/2588.76) lat (ms,95%): 7.56 err/s: 0.00 reconn/s: 0.00
[ 184s ] thds: 10 tps: 3741.75 qps: 3741.75 (r/w/o: 0.00/1129.92/2611.82) lat (ms,95%): 8.28 err/s: 0.00 reconn/s: 0.00
[ 185s ] thds: 10 tps: 4053.34 qps: 4053.34 (r/w/o: 0.00/1261.11/2792.23) lat (ms,95%): 7.70 err/s: 0.00 reconn/s: 0.00
[ 186s ] thds: 10 tps: 3831.98 qps: 3831.98 (r/w/o: 0.00/1133.99/2697.98) lat (ms,95%): 8.43 err/s: 0.00 reconn/s: 0.00
[ 187s ] thds: 10 tps: 3996.16 qps: 3996.16 (r/w/o: 0.00/1188.05/2808.11) lat (ms,95%): 7.56 err/s: 0.00 reconn/s: 0.00
[ 188s ] thds: 10 tps: 4178.94 qps: 4178.94 (r/w/o: 0.00/1249.98/2928.95) lat (ms,95%): 7.17 err/s: 0.00 reconn/s: 0.00
[ 189s ] thds: 10 tps: 3654.09 qps: 3654.09 (r/w/o: 0.00/1054.03/2600.06) lat (ms,95%): 8.90 err/s: 0.00 reconn/s: 0.00
[ 190s ] thds: 10 tps: 3700.97 qps: 3700.97 (r/w/o: 0.00/1120.99/2579.98) lat (ms,95%): 8.43 err/s: 0.00 reconn/s: 0.00

测试结果

SQL statistics:
    queries performed:
        read:                            0
        write:                           366172
        other:                           552067
        total:                           918239
    transactions:                        918239 (3060.73 per sec.)
    queries:                             918239 (3060.73 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0048s
    total number of events:              918239

Latency (ms):
         min:                                    0.04
         avg:                                    3.27
         max:                                  586.35
         95th percentile:                        9.39
         sum:                              2999188.03

Threads fairness:
    events (avg/stddev):           91823.9000/400.61
    execution time (avg/stddev):   299.9188/0.00

更新索引字段性能,oltp_update_index

测试命令

sysbench –db-driver=mysql –time=300 –threads=10 –report-interval=1 –mysql-host=127.0.0.1 –mysql-port=3306 –mysql-user=root –mysql-password=’******’ –mysql-db=test_db –tables=20 –table_size=1000000 oltp_update_index –db-ps-mode=disable run

测试数据

[ 222s ] thds: 10 tps: 4390.82 qps: 4390.82 (r/w/o: 0.00/968.18/3422.64) lat (ms,95%): 7.56 err/s: 0.00 reconn/s: 0.00
[ 223s ] thds: 10 tps: 4451.01 qps: 4451.01 (r/w/o: 0.00/1029.23/3421.78) lat (ms,95%): 7.98 err/s: 0.00 reconn/s: 0.00
[ 224s ] thds: 10 tps: 4508.21 qps: 4508.21 (r/w/o: 0.00/1062.05/3446.16) lat (ms,95%): 7.56 err/s: 0.00 reconn/s: 0.00
[ 225s ] thds: 10 tps: 3429.97 qps: 3429.97 (r/w/o: 0.00/811.76/2618.21) lat (ms,95%): 10.46 err/s: 0.00 reconn/s: 0.00
[ 226s ] thds: 10 tps: 4667.34 qps: 4667.34 (r/w/o: 0.00/1093.31/3574.03) lat (ms,95%): 7.30 err/s: 0.00 reconn/s: 0.00
[ 227s ] thds: 10 tps: 4238.59 qps: 4238.59 (r/w/o: 0.00/990.90/3247.68) lat (ms,95%): 6.79 err/s: 0.00 reconn/s: 0.00
[ 228s ] thds: 10 tps: 4300.49 qps: 4300.49 (r/w/o: 0.00/1092.87/3207.62) lat (ms,95%): 7.43 err/s: 0.00 reconn/s: 0.00
[ 229s ] thds: 10 tps: 4447.64 qps: 4447.64 (r/w/o: 0.00/1079.15/3368.48) lat (ms,95%): 7.70 err/s: 0.00 reconn/s: 0.00

测试结果

SQL statistics:
    queries performed:
        read:                            0
        write:                           295467
        other:                           936875
        total:                           1232342
    transactions:                        1232342 (4107.59 per sec.)
    queries:                             1232342 (4107.59 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0140s
    total number of events:              1232342

Latency (ms):
         min:                                    0.04
         avg:                                    2.43
         max:                                 1148.12
         95th percentile:                        7.70
         sum:                              2998912.79

Threads fairness:
    events (avg/stddev):           123234.2000/607.91
    execution time (avg/stddev):   299.8913/0.00

更新非索引字段性能,oltp_update_non_index

测试命令

sysbench –db-driver=mysql –time=300 –threads=10 –report-interval=1 –mysql-host=127.0.0.1 –mysql-port=3306 –mysql-user=root –mysql-password=’******’ –mysql-db=test_db –tables=20 –table_size=1000000 oltp_update_non_index –db-ps-mode=disable run

测试数据

[ 215s ] thds: 10 tps: 4941.69 qps: 4941.69 (r/w/o: 0.00/1194.92/3746.76) lat (ms,95%): 6.55 err/s: 0.00 reconn/s: 0.00
[ 216s ] thds: 10 tps: 4107.03 qps: 4107.03 (r/w/o: 0.00/992.77/3114.26) lat (ms,95%): 7.98 err/s: 0.00 reconn/s: 0.00
[ 217s ] thds: 10 tps: 4584.08 qps: 4585.08 (r/w/o: 0.00/1044.25/3540.83) lat (ms,95%): 8.13 err/s: 0.00 reconn/s: 0.00
[ 218s ] thds: 10 tps: 4947.58 qps: 4946.58 (r/w/o: 0.00/1200.14/3746.44) lat (ms,95%): 6.21 err/s: 0.00 reconn/s: 0.00
[ 219s ] thds: 10 tps: 5302.95 qps: 5302.95 (r/w/o: 0.00/1248.99/4053.96) lat (ms,95%): 6.09 err/s: 0.00 reconn/s: 0.00
[ 220s ] thds: 10 tps: 4318.10 qps: 4318.10 (r/w/o: 0.00/1063.02/3255.08) lat (ms,95%): 6.79 err/s: 0.00 reconn/s: 0.00
[ 221s ] thds: 10 tps: 5652.77 qps: 5652.77 (r/w/o: 0.00/1363.94/4288.83) lat (ms,95%): 7.30 err/s: 0.00 reconn/s: 0.00
[ 222s ] thds: 10 tps: 4128.77 qps: 4128.77 (r/w/o: 0.00/973.95/3154.83) lat (ms,95%): 9.56 err/s: 0.00 reconn/s: 0.00

测试结果

SQL statistics:
    queries performed:
        read:                            0
        write:                           322361
        other:                           1025120
        total:                           1347481
    transactions:                        1347481 (4491.48 per sec.)
    queries:                             1347481 (4491.48 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0065s
    total number of events:              1347481

Latency (ms):
         min:                                    0.05
         avg:                                    2.23
         max:                                  784.62
         95th percentile:                        7.04
         sum:                              2998814.89

Threads fairness:
    events (avg/stddev):           134748.1000/644.68
    execution time (avg/stddev):   299.8815/0.00

插入性能,oltp_insert

测试命令

sysbench –db-driver=mysql –time=300 –threads=10 –report-interval=1 –mysql-host=127.0.0.1 –mysql-port=3306 –mysql-user=root –mysql-password=’******’ –mysql-db=test_db –tables=20 –table_size=1000000 oltp_insert –db-ps-mode=disable run

测试数据

[ 230s ] thds: 10 tps: 1655.99 qps: 1655.99 (r/w/o: 0.00/1655.99/0.00) lat (ms,95%): 11.24 err/s: 0.00 reconn/s: 0.00
[ 231s ] thds: 10 tps: 1745.25 qps: 1745.25 (r/w/o: 0.00/1745.25/0.00) lat (ms,95%): 10.46 err/s: 0.00 reconn/s: 0.00
[ 232s ] thds: 10 tps: 1669.10 qps: 1669.10 (r/w/o: 0.00/1669.10/0.00) lat (ms,95%): 12.75 err/s: 0.00 reconn/s: 0.00
[ 233s ] thds: 10 tps: 1676.79 qps: 1676.79 (r/w/o: 0.00/1676.79/0.00) lat (ms,95%): 11.24 err/s: 0.00 reconn/s: 0.00
[ 234s ] thds: 10 tps: 1721.36 qps: 1721.36 (r/w/o: 0.00/1721.36/0.00) lat (ms,95%): 11.04 err/s: 0.00 reconn/s: 0.00
[ 235s ] thds: 10 tps: 1639.59 qps: 1639.59 (r/w/o: 0.00/1639.59/0.00) lat (ms,95%): 11.87 err/s: 0.00 reconn/s: 0.00
[ 236s ] thds: 10 tps: 1800.01 qps: 1800.01 (r/w/o: 0.00/1800.01/0.00) lat (ms,95%): 9.91 err/s: 0.00 reconn/s: 0.00
[ 237s ] thds: 10 tps: 1674.80 qps: 1674.80 (r/w/o: 0.00/1674.80/0.00) lat (ms,95%): 9.91 err/s: 0.00 reconn/s: 0.00

测试结果

SQL statistics:
    queries performed:
        read:                            0
        write:                           527182
        other:                           0
        total:                           527182
    transactions:                        527182 (1757.22 per sec.)
    queries:                             527182 (1757.22 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0081s
    total number of events:              527182

Latency (ms):
         min:                                    1.68
         avg:                                    5.69
         max:                                  525.61
         95th percentile:                       10.65
         sum:                              2998239.06

Threads fairness:
    events (avg/stddev):           52718.2000/60.72
    execution time (avg/stddev):   299.8239/0.00

写入性能,oltp_write_only

测试命令

sysbench –db-driver=mysql –time=300 –threads=10 –report-interval=1 –mysql-host=127.0.0.1 –mysql-port=3306 –mysql-user=root –mysql-password=’******’ –mysql-db=test_db –tables=20 –table_size=1000000 oltp_write_only –db-ps-mode=disable run

测试数据

[ 86s ] thds: 10 tps: 1112.14 qps: 6636.85 (r/w/o: 0.00/2819.36/3817.49) lat (ms,95%): 42.61 err/s: 0.00 reconn/s: 0.00
[ 87s ] thds: 10 tps: 1122.80 qps: 6736.82 (r/w/o: 0.00/2850.50/3886.32) lat (ms,95%): 27.66 err/s: 0.00 reconn/s: 0.00
[ 88s ] thds: 10 tps: 1226.66 qps: 7369.96 (r/w/o: 0.00/3021.16/4348.79) lat (ms,95%): 19.29 err/s: 0.00 reconn/s: 0.00
[ 89s ] thds: 10 tps: 645.13 qps: 3896.80 (r/w/o: 0.00/1665.34/2231.46) lat (ms,95%): 73.13 err/s: 0.00 reconn/s: 0.00
[ 90s ] thds: 10 tps: 1062.22 qps: 6373.30 (r/w/o: 0.00/2721.55/3651.74) lat (ms,95%): 43.39 err/s: 0.00 reconn/s: 0.00
[ 91s ] thds: 10 tps: 984.95 qps: 5870.71 (r/w/o: 0.00/2502.88/3367.84) lat (ms,95%): 59.99 err/s: 0.00 reconn/s: 0.00
[ 92s ] thds: 10 tps: 1144.76 qps: 6870.55 (r/w/o: 0.00/2963.37/3907.17) lat (ms,95%): 22.69 err/s: 0.00 reconn/s: 0.00
[ 93s ] thds: 10 tps: 1018.26 qps: 6146.56 (r/w/o: 0.00/2684.68/3461.88) lat (ms,95%): 44.98 err/s: 0.00 reconn/s: 0.00

测试结果

SQL statistics:
    queries performed:
        read:                            0
        write:                           803503
        other:                           926111
        total:                           1729614
    transactions:                        288269 (960.86 per sec.)
    queries:                             1729614 (5765.13 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          300.0115s
    total number of events:              288269

Latency (ms):
         min:                                    1.95
         avg:                                   10.41
         max:                                  413.10
         95th percentile:                       44.17
         sum:                              2999460.47

Threads fairness:
    events (avg/stddev):           28826.9000/33.90
    execution time (avg/stddev):   299.9460/0.00

测试完成-CleanUp

sysbench –db-driver=mysql –time=300 –threads=10 –report-interval=1 –mysql-host=127.0.0.1 –mysql-port=3306 –mysql-user=root –mysql-password=’**’ –mysql-db=test_db –tables=20 –table_size=1000000 oltp_read_write –db-ps-mode=disable cleanup

Dropping table 'sbtest1'...
Dropping table 'sbtest2'...
Dropping table 'sbtest3'...
Dropping table 'sbtest4'...
Dropping table 'sbtest5'...
Dropping table 'sbtest6'...
Dropping table 'sbtest7'...
Dropping table 'sbtest8'...
Dropping table 'sbtest9'...
Dropping table 'sbtest10'...
Dropping table 'sbtest11'...
Dropping table 'sbtest12'...
Dropping table 'sbtest13'...
Dropping table 'sbtest14'...
Dropping table 'sbtest15'...
Dropping table 'sbtest16'...
Dropping table 'sbtest17'...
Dropping table 'sbtest18'...
Dropping table 'sbtest19'...
Dropping table 'sbtest20'...

测试汇总

condition read write other total transactions tps qps min avg max 95th
oltp_read_write 1785882 510252 255126 2551260 127563 425.09 8501.77 4.24ms 23.52ms 1087.40ms 69.29ms
oltp_read_only 3682476 0 526068 4208544 263034 876.75 14027.94 1.66ms 11.40ms 183.17ms 15.27ms
oltp_delete 0 366172 552067 918239 918239 3060.73 3060.73 0.04ms 3.27ms 586.35ms 9.39ms
oltp_update_index 0 295467 936875 1232342 1232342 4107.59 4107.59 0.04ms 2.43ms 1148.12ms 7.70ms
oltp_update_non_index 0 322361 1025120 1347481 1347481 4491.48 4491.48 0.05ms 2.23ms 784.62ms 7.04ms
oltp_insert 0 527182 0 527182 527182 1757.22 1757.22 1.68ms 5.69ms 525.61ms 10.65ms
oltp_write_only 0 803503 926111 1729614 288269 960.86 5765.13 1.95ms 10.41ms 431.10ms 44.17ms

版权声明:本文为panzi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/panzi/p/12316948.html