Я модифицировал пример кода для использования на веб-сервере, таким образом, я могу запустить дротик как на сервере, так и на клиенте. Однако я решил, что хочу проверить производительность веб-сервера, и я в основном впечатлен, за исключением сбоя. Я использую пакет «siege» в Ubuntu, чтобы генерировать много трафика на веб-сайт, используя несколько URL-адресов.
Я видел, что он обеспечивает чуть севернее 1000 транзакций в секунду, что очень приемлемо для меня, но после двух-трех минут работы он либо дает сбой, либо зависает (если я увеличу new_gen_heap_size).
#import('dart:io');
class FCServer {
String basePath;
void send404(HttpResponse response)
{
response.statusCode = HttpStatus.NOT_FOUND;
response.outputStream.close();
}
void handleRequest(HttpRequest request, HttpResponse response)
{
final String path = request.path == '/' ? '/index.html' : request.path;
final File file = new File('${basePath}${path}');
file.exists().then((bool found) {
if (found)
{
file.fullPath().then((String fullPath) {
if (!fullPath.startsWith(basePath))
{
send404(response);
}
else
{
//print("delivering $fullPath");
response.headers.add("Cache-Control", "max-age=3600");
//file.openInputStream().pipe(response.outputStream);
var file = new File("$fullPath");
//response.headers.set(HttpHeaders.CONTENT_TYPE, "$contentType; charset=UTF-8");
response.outputStream.write(file.readAsBytesSync());
response.outputStream.close();
}
});
}
else
{
send404(response);
}
});
}
void startServer(String basePath)
{
this.basePath = basePath;
var server = new HttpServer();
print("Starting server with basePath: $basePath");
server.listen('192.168.0.14', 8080);
server.listen('127.0.0.1', 8080);
server.defaultRequestHandler = handleRequest;
}
}
FCServer webServe;
main()
{
// Compute base path for the request based on the location of the
// script and then start the server.
webServe = new FCServer();
File script = new File(new Options().script);
script.directory().then((Directory d) {
webServe.startServer(d.path);
});
}
Ошибка, которую Dart печатает перед выходом, выглядит следующим образом:
Exhausted heap space, trying to allocate 128096 bytes.
Exhausted heap space, trying to allocate 112 bytes.
Exception 'Instance of 'OutOfMemoryException'' thrown:
Exiting the process
Значит ли это, что где-то есть утечка памяти? Или кто-нибудь может объяснить, что происходит?
РЕДАКТИРОВАТЬ: когда new_gen_heap_size увеличивается до 1024, через некоторое время он зависает, и один поток находится на 100%, независимо от того, поступают ли запросы или нет. На данный момент объем ОЗУ составляет до 1,5 ГБ после прогона с вышеупомянутым размером кучи, поэтому я предполагаю, что сборщик мусора, так сказать, выкинул ведро.
EDIT 2: я изменил код так, что при инициализации он создает список, состоящий из 4 байтов, затем каждый раз, когда делается запрос, он просто записывает этот список в ответ и закрывает ответ. Использование памяти по-прежнему быстро растет, что указывает на более глубокую проблему в Dart. Это утомляет меня от использования Dart для полномасштабного проекта.