aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Nazaryev <sergey@nazaryev.ru>2018-11-07 01:53:21 +0000
committerSergey Nazaryev <sergey@nazaryev.ru>2018-11-07 01:53:21 +0000
commit6d589161c4037ddead850f1508930ff96f1f3450 (patch)
tree52fecb035196fda7edf0e16e6e7f2dd6eb7384ea
parent04efa585aa227d44dad4a8f313bdc4e5bd2a9de5 (diff)
downloadifstat-6d589161c4037ddead850f1508930ff96f1f3450.zip
ifstat-6d589161c4037ddead850f1508930ff96f1f3450.tar.gz
ifstat-6d589161c4037ddead850f1508930ff96f1f3450.tar.bz2
Перешёл с BPF_ARRAY на BPF_PERCPU_ARRAY
-rw-r--r--README.md10
-rw-r--r--ifstat_kern.c2
-rwxr-xr-xifstatd.lua14
3 files changed, 16 insertions, 10 deletions
diff --git a/README.md b/README.md
index 2a634ff..dd305bb 100644
--- a/README.md
+++ b/README.md
@@ -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