В рамках всего фреймворка CxxConet существует 4 типа рабочих корутин:
Корутина приёма соединений: отвечает за приём новых клиентских подключений и создание обрабатывающих корутин ввода-вывода для обработки транзакций верхнего уровня каждого клиента.
Глобальная статистическая корутина: периодически собирает статистику по каждой корутине и реализует сбор данных без блокировок.
Очищающая корутина: регулярно очищает неактивные соединения, предотвращая истощение ресурсов.
Обрабатывающая корутина ввода-вывода: каждая клиентская связь имеет свою собственную обрабатывающую корутину ввода-вывода, которая включает в себя чтение и запись, а также обработку транзакций верхнего уровня.
Корутины приёма соединений, глобальная статистическая и очищающая корутины используют один и тот же поток, в то время как обрабатывающие корутины ввода-вывода работают в отдельных потоках.
IoAcceptor — это интерфейс, который отвечает за установление сокетных соединений.
IoFilter — это интерфейс, определяющий набор фильтров, которые могут включать в себя ведение журнала, чёрный список, кодирование данных (направление записи) и декодирование (направление чтения), а также другие функции.
ConnectionHandler — это интерфейс, отвечающий за написание бизнес-логики, включая приём и отправку данных.
#include "ENaf.hh"
static sp<ELogger> logger = ELoggerManager::getLogger("testnaf");
static void onListening(ESocketAcceptor* acceptor) {
logger->trace("onListening...");
while (!acceptor->isDisposed()) {
sleep(10);
EIoServiceStatistics* ss = acceptor->getStatistics();
logger->trace_("ReadBytes=%ld", ss->getReadBytes());
logger->trace_("WrittenBytes=%ld", ss->getWrittenBytes());
}
logger->trace("Out of Listening.");
}
static void onConnection(ESocketSession* session) {
logger->trace("onConnection...");
sp<EIoBuffer> request;
while(!session->getService()->isDisposed()) {
try {
request = dynamic_pointer_cast<EIoBuffer>(session->read());
} catch (ESocketTimeoutException& e) {
logger->trace("session read timeout.");
continue;
} catch (EIOException& e) {
logger->trace("session read error.");
break;
}
if (request == null) {
logger->trace("session client closed.");
break;
}
// echo.
session->write(request);
}
logger->trace("Out of Connection.");
}
int main(int argc, const char **argv) {
// CxxJDK init.
ESystem::init(argc, argv);
// CxxLog4j init.
ELoggerManager::init("log4e.conf");
ESocketAcceptor sa;
EBlacklistFilter blf;
blf.block("localhost");
sa.getFilterChainBuilder()->addFirst("black", &blf);
sa.setListeningHandler(onListening);
sa.setConnectionHandler(onConnection);
sa.setMaxConnections(1000000);
sa.setSoTimeout(3000);
sa.setSessionIdleTime(EIdleStatus::WRITER_IDLE, 30);
sa.bind("0.0.0.0", 8888);
sa.listen();
ESystem::exit(0);
return 0;
}
Дополнительные примеры:
testnaf.cpp
Тестовая программа:
см. пример кода на C++: benchmark.cpp;
Программное окружение:
# cat /etc/redhat-release
CentOS release 6.4 (Final)
# uname -a
Linux cxxjava 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Аппаратное окружение:
Тип устройства: R6240-12
Название процессора: Intel Xeon E5606
Скорость процессора: 2,13 ГГц
Количество процессоров: 4
Общее количество ядер: 8
Результаты тестирования:
# ab -c 20 -n 50000 http://localhost:8888/
Это ApacheBench, версия 2.3 <$Revision: 655654 $>
Авторское право 1996 Адам Твисс, Zeus Technology Ltd, http://www.zeustech.net/
Лицензия предоставлена The Apache Software Foundation, http://www.apache.org/
Бенчмаркинг localhost (будьте терпеливы)
Завершено 50 000 запросов
Завершено 10 000 запросов
Завершено 15 000 запросов
Завершено 20 000 запросов
Завершено 25 000 запросов
Завершено 30 000 запросов
Завершено 35 000 запросов
Завершено 40 000 запросов
Завершено 45 000 запросов
Завершено 50 000 запросов
Закончено 50 000 запросов
Программное обеспечение сервера:
Имя хоста сервера: localhost
Порт сервера: 8888
Путь к документу: /
Длина документа: 3 байта
Уровень параллелизма: 20
Время, затраченное на тесты: 4,077 секунды
Полные запросы: 50 000
Неудачные запросы: 0
Ошибки записи: 0
Всего передано: 2 050 328 байт
Передано HTML: 150 024 байта
Запросы в секунду: 12 264,64 [#/сек] (среднее значение)
Время на запрос:
``` 1.631 [мс] (среднее значение)
Время на запрос: 0,082 [мс] (среднее по всем одновременным запросам)
Скорость передачи данных: получено 491,14 [Кбайт/сек]
**Время соединения (мс)**
| | мин | среднее [+/- стандартное отклонение] | медиана | макс |
|:--:|:---:|:------------------------------------:|:-----:|:----:|
| Подключение | 0 | 1 | 0,1 | 1 | 4 |
| Обработка | 0 | 1 | 0,3 | 1 | 16 |
| Ожидание | 0 | 1 | 0,3 | 1 | 16 |
| Общее | 0 | 2 | 0,3 | 2 | 17 |
Процент запросов, выполненных за определённое время (мс)
| | 50% | 66% | 75% | 80% | 90% | 95% | 98% | 99% | 100% (самый долгий запрос) |
|---|---|---|---|---|---|---|---|---| ---|
| | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 17 |
#### Зависимости
1. CxxJDK (https://github.com/cxxjava/CxxJDK)
2. CxxFiber (https://github.com/cxxjava/CxxFiber)
3. CxxLog4j (https://github.com/cxxjava/CxxLog4j)
#### Поддержка
Email: cxxjava@163.com
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )