Skip to content

Commit a417c79

Browse files
Anders Johnsenkevmoo
authored andcommitted
Use ServerSocketReference to scale to the number of cores.
1 parent b26be29 commit a417c79

File tree

3 files changed

+58
-93
lines changed

3 files changed

+58
-93
lines changed

frameworks/Dart/dart/pubspec.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
name: dartbenchmark
22
description: A benchmark of dart
33
environment:
4-
sdk: ">=1.3.0 <2.0.0"
4+
sdk: '>=1.6.0 <2.0.0'
55
dependencies:
6-
args: 0.11.0+1
6+
args: 0.12.0+2
77
crypto: 0.9.0
88
mustache: 0.1.8
9-
postgresql: 0.2.13
10-
yaml: 0.9.0
9+
postgresql: 0.2.14
10+
yaml: 2.0.1+1

frameworks/Dart/dart/server.dart

Lines changed: 53 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:async' show Future;
2-
import 'dart:io';
32
import 'dart:convert';
3+
import 'dart:io';
4+
import 'dart:isolate';
45
import 'dart:math' show Random;
56
import 'package:args/args.dart' show ArgParser;
67
import 'package:mustache/mustache.dart' as mustache;
@@ -17,11 +18,26 @@ main(List<String> args) {
1718
parser.addOption('address', abbr: 'a', defaultsTo: '0.0.0.0');
1819
parser.addOption('port', abbr: 'p', defaultsTo: '8080');
1920
parser.addOption('dbconnections', abbr: 'd', defaultsTo: '256');
21+
parser.addOption('isolates', abbr: 'i', defaultsTo: '1');
2022
var arguments = parser.parse(args);
21-
_startServer(
22-
arguments['address'],
23-
int.parse(arguments['port']),
24-
int.parse(arguments['dbconnections']));
23+
var isolates = int.parse(arguments['isolates']);
24+
var dbConnections = int.parse(arguments['dbconnections']) ~/ isolates;
25+
ServerSocket.bind(arguments['address'], int.parse(arguments['port']))
26+
.then((server) {
27+
var ref = server.reference;
28+
for (int i = 1; i < isolates; i++) {
29+
Isolate.spawn(startInIsolate, [ref, dbConnections]);
30+
}
31+
_startServer(server, dbConnections);
32+
});
33+
}
34+
35+
void startInIsolate(args) {
36+
var ref = args[0];
37+
var dbConnections = args[1];
38+
ref.create().then((server) {
39+
_startServer(server, dbConnections);
40+
});
2541
}
2642

2743
/// The entity used in the database query and update tests.
@@ -51,15 +67,6 @@ const _WORLD_TABLE_SIZE = 10000;
5167
/// A random number generator.
5268
final _RANDOM = new Random();
5369

54-
/// The 'text/html; charset=utf-8' content type.
55-
final _TYPE_HTML = new ContentType('text', 'html', charset: 'utf-8');
56-
57-
/// The 'application/json' content type.
58-
final _TYPE_JSON = new ContentType('application', 'json');
59-
60-
/// The 'text/html; charset=utf-8' content type.
61-
final _TYPE_TEXT = new ContentType('text', 'plain', charset: 'utf-8');
62-
6370
/// The PostgreSQL connection pool used by all the tests that require database
6471
/// connectivity.
6572
var _connectionPool;
@@ -70,7 +77,7 @@ var _fortunesTemplate;
7077
/// Starts a benchmark server, which listens for connections from
7178
/// '[address] : [port]' and maintains [dbConnections] connections to the
7279
/// database.
73-
_startServer(address, port, dbConnections) {
80+
_startServer(serverSocket, dbConnections) {
7481
Future.wait([
7582
new File('postgresql.yaml').readAsString().then((config) {
7683
_connectionPool = new pgpool.Pool(
@@ -83,33 +90,33 @@ _startServer(address, port, dbConnections) {
8390
_fortunesTemplate = mustache.parse(template);
8491
})
8592
]).then((_) {
86-
HttpServer.bind(address, port).then((server) {
87-
server.serverHeader = 'dart';
88-
server.listen((request) {
89-
switch (request.uri.path) {
90-
case '/json':
91-
_jsonTest(request);
92-
break;
93-
case '/db':
94-
_dbTest(request);
95-
break;
96-
case '/queries':
97-
_queriesTest(request);
98-
break;
99-
case '/fortunes':
100-
_fortunesTest(request);
101-
break;
102-
case '/updates':
103-
_updatesTest(request);
104-
break;
105-
case '/plaintext':
106-
_plaintextTest(request);
107-
break;
108-
default:
109-
_sendResponse(request, HttpStatus.NOT_FOUND);
110-
break;
111-
}
112-
});
93+
var server = new HttpServer.listenOn(serverSocket);
94+
server.defaultResponseHeaders.clear();
95+
server.serverHeader = 'dart';
96+
server.listen((request) {
97+
switch (request.uri.path) {
98+
case '/json':
99+
_jsonTest(request);
100+
break;
101+
case '/db':
102+
_dbTest(request);
103+
break;
104+
case '/queries':
105+
_queriesTest(request);
106+
break;
107+
case '/fortunes':
108+
_fortunesTest(request);
109+
break;
110+
case '/updates':
111+
_updatesTest(request);
112+
break;
113+
case '/plaintext':
114+
_plaintextTest(request);
115+
break;
116+
default:
117+
_sendResponse(request, HttpStatus.NOT_FOUND);
118+
break;
119+
}
113120
});
114121
});
115122
}
@@ -140,17 +147,18 @@ _sendResponse(request, statusCode, [ type, response ]) {
140147

141148
/// Completes the given [request] by writing the [response] as HTML.
142149
_sendHtml(request, response) {
143-
_sendResponse(request, HttpStatus.OK, _TYPE_HTML, response);
150+
_sendResponse(request, HttpStatus.OK, ContentType.HTML, response);
144151
}
145152

146153
/// Completes the given [request] by writing the [response] as JSON.
147154
_sendJson(request, response) {
148-
_sendResponse(request, HttpStatus.OK, _TYPE_JSON, JSON.encode(response));
155+
_sendResponse(
156+
request, HttpStatus.OK, ContentType.JSON, JSON.encode(response));
149157
}
150158

151159
/// Completes the given [request] by writing the [response] as plain text.
152160
_sendText(request, response) {
153-
_sendResponse(request, HttpStatus.OK, _TYPE_TEXT, response);
161+
_sendResponse(request, HttpStatus.OK, ContentType.TEXT, response);
154162
}
155163

156164
/// Responds with the JSON test to the [request].

frameworks/Dart/dart/setup.py

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -13,55 +13,12 @@ def start(args, logfile, errfile):
1313
#
1414
# start dart servers
1515
#
16-
for port in range(9001, 9001 + args.max_threads):
17-
subprocess.Popen('dart server.dart -a 127.0.0.1 -p ' + str(port) + ' -d ' + str(args.max_concurrency / args.max_threads), shell=True, cwd='dart', stderr=errfile, stdout=logfile)
18-
#
19-
# create nginx configuration
20-
#
21-
conf = []
22-
conf.append('worker_processes ' + str(args.max_threads) + ';')
23-
conf.append('error_log stderr error;')
24-
conf.append('events {')
25-
conf.append(' worker_connections 1024;')
26-
conf.append('}')
27-
conf.append('http {')
28-
conf.append(' access_log off;')
29-
conf.append(' include /usr/local/nginx/conf/mime.types;')
30-
conf.append(' default_type application/octet-stream;')
31-
conf.append(' sendfile on;')
32-
conf.append(' upstream dart_cluster {')
33-
for port in range(9001, 9001 + args.max_threads):
34-
conf.append(' server 127.0.0.1:' + str(port) + ';')
35-
conf.append(' keepalive ' + str(args.max_concurrency / args.max_threads) + ';')
36-
conf.append(' }')
37-
conf.append(' server {')
38-
conf.append(' listen 8080;')
39-
conf.append(' location / {')
40-
conf.append(' proxy_pass http://dart_cluster;')
41-
conf.append(' proxy_http_version 1.1;')
42-
conf.append(' proxy_set_header Connection "";')
43-
conf.append(' }')
44-
conf.append(' }')
45-
conf.append('}')
46-
#
47-
# write nginx configuration to disk
48-
#
49-
with open('dart/nginx.conf', 'w') as f:
50-
f.write('\n'.join(conf))
51-
#
52-
# start nginx
53-
#
54-
subprocess.Popen('sudo /usr/local/nginx/sbin/nginx -c $TROOT/nginx.conf', shell=True, cwd='dart', stderr=errfile, stdout=logfile);
16+
subprocess.Popen('dart server.dart -a 0.0.0.0 -p 8080 -d ' + str(args.max_concurrency) + ' -i ' + str(args.max_threads), shell=True, cwd='dart', stderr=errfile, stdout=logfile)
5517
return 0
5618
except subprocess.CalledProcessError:
5719
return 1
5820

5921
def stop(logfile, errfile):
60-
#
61-
# stop nginx
62-
#
63-
subprocess.check_call('sudo /usr/local/nginx/sbin/nginx -c $TROOT/nginx.conf -s stop', shell=True, cwd='dart', stderr=errfile, stdout=logfile)
64-
os.remove('dart/nginx.conf')
6522
#
6623
# stop dart servers
6724
#

0 commit comments

Comments
 (0)