diff options
author | Sergey Nazaryev <sergey@nazaryev.ru> | 2018-11-07 01:53:21 +0000 |
---|---|---|
committer | Sergey Nazaryev <sergey@nazaryev.ru> | 2018-11-07 01:53:21 +0000 |
commit | 6d589161c4037ddead850f1508930ff96f1f3450 (patch) | |
tree | 52fecb035196fda7edf0e16e6e7f2dd6eb7384ea | |
parent | 04efa585aa227d44dad4a8f313bdc4e5bd2a9de5 (diff) | |
download | ifstat-6d589161c4037ddead850f1508930ff96f1f3450.zip ifstat-6d589161c4037ddead850f1508930ff96f1f3450.tar.gz ifstat-6d589161c4037ddead850f1508930ff96f1f3450.tar.bz2 |
Перешёл с BPF_ARRAY на BPF_PERCPU_ARRAY
-rw-r--r-- | README.md | 10 | ||||
-rw-r--r-- | ifstat_kern.c | 2 | ||||
-rwxr-xr-x | ifstatd.lua | 14 |
3 files changed, 16 insertions, 10 deletions
@@ -22,19 +22,17 @@ ifstat ## TODO - 1. **IMPORTANT!** Перейти с `BPF_ARRAY` на `BPF_TABLE("percpu_array", ...)` - - 2. Завести автоматические тесты с запуском `tcpreplay`, созданием + 1. Завести автоматические тесты с запуском `tcpreplay`, созданием виртуального сетевого интерфейса и валидацией полученной статистики; - 3. Написать инструкцию/скрипт с точностью до команд, с информацией + 2. Написать инструкцию/скрипт с точностью до команд, с информацией о том, как установить все необходимые зависимости для Debian; - 4. Провести ручное нагрузочное тестирование на реальном железе с + 3. Провести ручное нагрузочное тестирование на реальном железе с Debian и посмотреть на производительность; - 5. Перейти с lua-based конфига на что-то, что можно адекватно + 4. Перейти с lua-based конфига на что-то, что можно адекватно валидировать (ini/yaml/toml). ## Запуск и конфигурация diff --git a/ifstat_kern.c b/ifstat_kern.c index e5e4b88..523f450 100644 --- a/ifstat_kern.c +++ b/ifstat_kern.c @@ -71,7 +71,7 @@ static inline int filter ## NUM ## _check(struct pkt_info *pkt) { \ #define FILTER_INIT(NUM) \ static inline u64 * filter ## NUM ##_lookup(u32 bkt_num); \ - BPF_ARRAY(filter ## NUM, u64, BUCKET_LAST); \ + BPF_PERCPU_ARRAY(filter ## NUM, u64, BUCKET_LAST); \ FILTER_CHECK_FUNC(NUM, FILTER ## NUM ## _SRC_PORT, \ FILTER ## NUM ## _DST_PORT, \ FILTER ## NUM ## _SRC_IP, \ diff --git a/ifstatd.lua b/ifstatd.lua index 09c7a27..d311435 100755 --- a/ifstatd.lua +++ b/ifstatd.lua @@ -77,9 +77,17 @@ local serialize_ifstat_data = function(bpf, filters) local id = "filter" .. filter.filter_num local data = bpf:get_table(id) ifstat_data[id] = {} - for idx, value in data:items(true) do - local column = filter_data_columns[idx-1] - ifstat_data[id][column] = tonumber(value) + for idx, per_cpu_array in data:items(true) do + local column = filter_data_columns[idx-1] + local sum = 0 + for cpu_num, value in ipairs(per_cpu_array) do + sum = sum + tonumber(value) + end + + -- Судя по всему, по ubus не стоит передавать числа больше + -- u32 по размеру именно в виде чисел, так что отправляем как + -- строку + ifstat_data[id][column] = tostring(sum) end end end |