Skip to content

Latest commit

 

History

History

libstatistics

频率控制与接口统计模块

1. 功能介绍

  • 支持RPC总调用次数控制
  • 支持配置RPC单个接口频率控制
  • 默认令牌桶初始化含有桶大小的3/4令牌
  • 统计RPC调用次数与耗时
  • 统计P2P包数量

2. 配置文件介绍

config.json配置项

  • config.json添加limitconf配置文件路径
  • config.json添加statsInterval添加统计时长设置(以秒计),按统计时长输出结果到info日志文件,无接口调用则不输出,无此配置项则不启动统计功能
{
    "limitconf":"/home/ubuntu/nodedata/singleNode/limit.conf",
    "statsInterval":"5"    
}

频率控制配置文件

  • 配置文件示例
{
    "globalLimit": {
        "enable": true,
        "defaultLimit": 100
    },
    "interfaceLimit": {
        "enable": true,
        "defaultLimit": 0,
        "custom": {
            "eth_getBlockByNumber": 50,
            "eth_sendRawTransaction": 50
        }
    }
}
  • globalLimit说明

总调用次数控制相关配置,其中enable选项控制是否启用总调用控制,取值为bool类型,defaultLimit设置每秒总计允许多少次RPC调用,取值为uint

  • interfaceLimit说明

每个IP每秒访问接口次数控制,其中enable选项控制是否启用此功能,defaultLimit设置默认接口调用频率,值类型为uint,当取值0时,检查custom是否有调用接口配置,如果没有则默认不控制接口调用频率,否则按照custom对接口频率控制。

3. 模块代码说明

模块组织说明

源文件 备注
libstatistics/CMakeLists.txt cmake文件
libstatistics/boost_shm.h 共享内存相关头文件
libstatistics/InterfaceStatistics.cpp 接口统计实现
libstatistics/InterfaceStatistics.h 接口统计头文件
libstatistics/RateLimiter.cpp 频率控制源码
libstatistics/RateLimiter.h 频率控制头文件
libstatistics/RateLimitHttpServer.cpp 频率控制调用
libstatistics/RateLimitHttpServer.h 修改了HttpServercallback函数
libstatistics/limit.conf 频率控制配置文件示例
libstatistics/README.md 模块说明及测试用例

涉及文件

源文件 备注
eth/main.cpp new InterfaceStatistics()创建对象
libweb3jsonrpc/ModularServer.h ModularServer添加statistics指针
libweb3jsonrpc/ModularServer.h HandleMethodCall添加统计代码
libweb3jsonrpc/SafeHttpServer.h #include "libStatisticsLimiter/RateLimitHttpServer.h"
libethcore/ChainOperationParams.h 添加配置参数"limitconf","statsInterval"
libethereum/ChainParams.cpp 配置参数处理
libp2p/Session.h 添加statistics指针
libp2p/Session.cpp readPacket添加统计代码
libp2p/Host.cpp 293行setStatistics函数

4. 测试用例

4.1 测试RPC接口统计

  1. 前置条件
  • config.json文件中配置统计时长,例如每隔5秒输出统计结果"statsInterval":"5",如果不配置则不启动接口统计(info日志输出RPC 's statistics is off)
  1. 用例步骤
  • perfoemance文件夹下,部署合约babel-node deploy.js Ok

  • 使用perfoemance/performance.js发送交易,参数为babel-node performance.js Ok 1000 100

  • 使用tail -f info* | grep "Statistics RPC"查看日志文件

  1. 预期结果
INFO|2017-08-10 15:24:07|15:23:57|Statistics RPC|Name:eth_sendRawTransaction   |Count:  720|Avg: 1.07 ms|Max: 43 ms
INFO|2017-08-10 15:24:07|15:23:57|Statistics RPC|Name:eth_blockNumber          |Count:    1|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-10 15:24:17|15:24:07|Statistics RPC|Name:eth_call                 |Count:    1|Avg: 3.00 ms|Max:  3 ms
INFO|2017-08-10 15:24:17|15:24:07|Statistics RPC|Name:eth_getBlockByNumber     |Count:   14|Avg: 0.29 ms|Max:  1 ms
INFO|2017-08-10 15:24:17|15:24:07|Statistics RPC|Name:eth_getTransactionReceipt|Count:    2|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-10 15:24:17|15:24:07|Statistics RPC|Name:eth_sendRawTransaction   |Count:  280|Avg: 0.41 ms|Max:  6 ms

4.2 测试P2P接口统计

  1. 前置条件
  • 开启两个以上的节点测试
  • config.json文件中配置统计时长,例如每隔5秒输出统计结果"statsInterval":"5",如果不配置则每10秒输出统计结果
  1. 用例步骤
  • 使用tail -f info* | grep "Statistics P2P"查看日志文件
  1. 预期结果
INFO|2017-08-18 21:42:20|21:42:10|Statistics P2P0aae4|Name:0aae4...ce885-0-39       |Count:  20|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-18 21:42:30|21:42:20|Statistics P2P5b466|Name:5b466...b81fc-0-39       |Count:  17|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-18 21:42:30|21:42:20|Statistics P2P0aae4|Name:0aae4...ce885-0-39       |Count:  20|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-18 21:42:30|21:42:20|Statistics P2P5b466|Name:5b466...b81fc-0-36       |Count:   7|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-18 21:42:30|21:42:20|Statistics P2P0aae4|Name:0aae4...ce885-0-36       |Count:   7|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-18 21:42:40|21:42:30|Statistics P2P5b466|Name:5b466...b81fc-0-2        |Count:   1|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-18 21:42:40|21:42:30|Statistics P2P0aae4|Name:0aae4...ce885-0-2        |Count:   1|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-18 21:42:40|21:42:30|Statistics P2P5b466|Name:5b466...b81fc-0-39       |Count:  18|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-18 21:42:40|21:42:30|Statistics P2P0aae4|Name:0aae4...ce885-0-39       |Count:  20|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-18 21:42:40|21:42:30|Statistics P2P5b466|Name:5b466...b81fc-0-36       |Count:   7|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-18 21:42:40|21:42:30|Statistics P2P0aae4|Name:0aae4...ce885-0-36       |Count:   7|Avg: 0.00 ms|Max:  0 ms

4.3 测试共享内存

  1. 前置条件
  • 启动节点
  1. 用例步骤
  • 查看eth启动的文件夹目录下是否有内存映射文件
  • 设置较长的统计时长,打断eth进程后重启,查看日志的统计输出
  1. 预期结果
RPC_MappedFile
RPCSSL_MappedFile
IPC_MappedFile
P2P_MappedFile

4.4 测试频率控制

  1. 前置条件
  • config.json文件中配置频率控制文件路径,例如"limitconf":"/home/ubuntu/nodedata/singleNode/limit.conf"
  • config.json文件中配置统计时长,例如每隔10秒输出统计结果"statsInterval":"10"
  • limit.conf中配置如下
{
    "globalLimit": {
        "enable": true,
        "defaultLimit": 500
    },
    "interfaceLimit": {
        "enable": true,
        "defaultLimit": 0,
        "custom": {
            "eth_getBlockByNumber": 100,
            "eth_sendRawTransaction": 10
        }
    }
}
  1. 用例步骤
  • perfoemance文件夹下,部署合约babel-node deploy.js Ok

  • 使用perfoemance/performance.js发送交易,参数为babel-node performance.js Ok 10000 100

  • 使用tail -f info* | grep "Statistics RPC"查看日志文件

  1. 预期结果

可以看到,每10秒统计RPC接口调用次数,平均每秒控制在100,因为桶初始有0.75*capacity令牌,所以会有一定误差

INFO|2017-08-09 21:21:58|21:21:48|Statistics RPC|Name:eth_sendRawTransaction   |Count:   60|Avg: 0.15 ms|Max:  2 ms
INFO|2017-08-09 21:21:58|21:21:48|Statistics RPC|Name:eth_blockNumber          |Count:    1|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-09 21:22:08|21:21:58|Statistics RPC|Name:eth_sendRawTransaction   |Count:   99|Avg: 0.01 ms|Max:  1 ms
INFO|2017-08-09 21:22:18|21:22:08|Statistics RPC|Name:eth_sendRawTransaction   |Count:   99|Avg: 0.01 ms|Max:  1 ms
INFO|2017-08-09 21:22:28|21:22:18|Statistics RPC|Name:eth_sendRawTransaction   |Count:  100|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-09 21:22:38|21:22:28|Statistics RPC|Name:eth_sendRawTransaction   |Count:   99|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-09 21:22:48|21:22:38|Statistics RPC|Name:eth_sendRawTransaction   |Count:   99|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-09 21:22:58|21:22:48|Statistics RPC|Name:eth_sendRawTransaction   |Count:  100|Avg: 0.03 ms|Max:  2 ms
INFO|2017-08-09 21:23:08|21:22:58|Statistics RPC|Name:eth_sendRawTransaction   |Count:  100|Avg: 0.01 ms|Max:  1 ms
INFO|2017-08-09 21:23:18|21:23:08|Statistics RPC|Name:eth_sendRawTransaction   |Count:   99|Avg: 0.01 ms|Max:  1 ms
INFO|2017-08-09 21:23:28|21:23:18|Statistics RPC|Name:eth_sendRawTransaction   |Count:   99|Avg: 0.01 ms|Max:  1 ms
INFO|2017-08-09 21:23:38|21:23:28|Statistics RPC|Name:eth_sendRawTransaction   |Count:  100|Avg: 0.01 ms|Max:  1 ms
INFO|2017-08-09 21:23:48|21:23:38|Statistics RPC|Name:eth_getBlockByNumber     |Count:   23|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-09 21:23:48|21:23:38|Statistics RPC|Name:eth_getTransactionReceipt|Count:    4|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-09 21:23:48|21:23:38|Statistics RPC|Name:eth_sendRawTransaction   |Count:   47|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-09 21:23:58|21:23:48|Statistics RPC|Name:eth_getBlockByNumber     |Count:   53|Avg: 0.00 ms|Max:  0 ms
INFO|2017-08-09 21:24:08|21:23:58|Statistics RPC|Name:eth_call                 |Count:    1|Avg: 3.00 ms|Max:  3 ms
INFO|2017-08-09 21:24:08|21:23:58|Statistics RPC|Name:eth_getBlockByNumber     |Count:   37|Avg: 0.00 ms|Max:  0 ms