Simple web server benchmark - vibe.d is slower than node.js and Go?

Arun Chandrasekaran aruncxy at gmail.com
Wed May 9 22:37:22 UTC 2018


On Wednesday, 9 May 2018 at 21:55:15 UTC, Daniel Kozak wrote:
> On which system? AFAIK HTTPServerOption.reusePort works on 
> Linux but maybe not on others OSes. Other question is what 
> events driver is use (libasync, libevent, vibe-core)
>
> On Wed, May 9, 2018 at 9:12 PM, Arun Chandrasekaran via 
> Digitalmars-d < digitalmars-d at puremagic.com> wrote:
>
>> On Monday, 30 October 2017 at 17:23:02 UTC, Daniel Kozak wrote:
>>
>>> Maybe this one:
>>>
>>> import vibe.d;
>>> import std.regex;
>>> import std.array : appender;
>>>
>>> static reg = ctRegex!"^/greeting/([a-z]+)$";
>>>
>>> void main()
>>> {
>>>     setupWorkerThreads(logicalProcessorCount);
>>>     runWorkerTaskDist(&runServer);
>>>     runApplication();
>>> }
>>>
>>> void runServer()
>>> {
>>>     auto settings = new HTTPServerSettings;
>>>     settings.options |= HTTPServerOption.reusePort;
>>>     settings.port = 3000;
>>>     settings.serverString = null;
>>>     listenHTTP(settings, &handleRequest);
>>> }
>>>
>>> void handleRequest(HTTPServerRequest req,
>>>                     HTTPServerResponse res)
>>> {
>>>     switch(req.path)
>>>     {
>>>     case "/": res.writeBody("Hello World", "text/plain");
>>>         break;
>>>     default:
>>>         auto m = matchFirst(req.path, reg);
>>>         string message = "Hello, ";
>>>         auto app = appender(message);
>>>         app.reserve(32);
>>>         app ~= m[1];
>>>         res.writeBody(app.data, "text/plain");
>>>     }
>>> }
>>>
>>> On Mon, Oct 30, 2017 at 5:41 PM, ade90036 via Digitalmars-d < 
>>> digitalmars-d at puremagic.com> wrote:
>>>
>>> On Thursday, 21 September 2017 at 13:09:33 UTC, Daniel Kozak 
>>> wrote:
>>>>
>>>> wrong version, this is my letest version: 
>>>> https://paste.ofcode.org/qWsQi
>>>>> kdhKiAywgBpKwANFR
>>>>>
>>>>> On Thu, Sep 21, 2017 at 3:01 PM, Daniel Kozak 
>>>>> <kozzi11 at gmail.com> wrote:
>>>>>
>>>>> my version: https://paste.ofcode.org/RLX7GM6SHh3DjBBHd7wshj
>>>>>
>>>>>>
>>>>>> On Thu, Sep 21, 2017 at 2:50 PM, Sönke Ludwig via 
>>>>>> Digitalmars-d < digitalmars-d at puremagic.com> wrote:
>>>>>>
>>>>>> Am 21.09.2017 um 14:41 schrieb Vadim Lopatin:
>>>>>>
>>>>>>>
>>>>>>> [...]
>>>>>>>
>>>>>>>>
>>>>>>>> Oh, sorry, I forgot the reusePort option, so that 
>>>>>>>> multiple sockets
>>>>>>> can listen on the same port:
>>>>>>>
>>>>>>>     auto settings = new 
>>>>>>> HTTPServerSettings("0.0.0.0:3000");
>>>>>>>     settings.options |= HTTPServerOption.reusePort;
>>>>>>>     listenHTTP(settings, &handleRequest);
>>>>>>>
>>>>>>>
>>>>>> Hi, would it be possible to re-share the example of vibe.d 
>>>>>> woth
>>>> multithreaded support.
>>>>
>>>> The pastebin link has expired and the pull request doesnt 
>>>> have the latest version.
>>>>
>>>> Thanks
>>>>
>>>> Ade
>>>>
>>>
>> With vibe.d 0.8.2, even when multiple worker threads are 
>> setup, only one thread handles the requests:
>>
>> ```
>> import core.thread;
>> import vibe.d;
>> import std.experimental.all;
>>
>> auto reg = ctRegex!"^/greeting/([a-z]+)$";
>>
>> void main()
>> {
>>     writefln("Master %d is running", getpid());
>>     setupWorkerThreads(logicalProcessorCount + 1);
>>     runWorkerTaskDist(&runServer);
>>     runApplication();
>> }
>>
>> void runServer()
>> {
>>     auto settings = new HTTPServerSettings;
>>     settings.options |= HTTPServerOption.reusePort;
>>     settings.port = 8080;
>>     settings.bindAddresses = ["127.0.0.1"];
>>     listenHTTP(settings, &handleRequest);
>> }
>>
>> void handleRequest(HTTPServerRequest req,
>>                     HTTPServerResponse res)
>> {
>>     writeln("My Thread Id: ", to!string(thisThreadID));
>>     // simulate long runnig task
>>     Thread.sleep(dur!("seconds")(3));
>>
>>     if (req.path == "/")
>>         res.writeBody("Hello, World! from " ~ 
>> to!string(thisThreadID),
>> "text/plain");
>>     else if (auto m = matchFirst(req.path, reg))
>>         res.writeBody("Hello, " ~ m[1] ~ " from " ~
>> to!string(thisThreadID), "text/plain");
>> }
>> ```
>>
>> That could be the reason for slowness.

Ubuntu 17.10 64 bit, DMD v2.079.1, E7-4860, 8 core 32 GB RAM.

With slight modifcaition to capture the timestamp of the request 
on the server:

     import std.datetime.systime : Clock;
     auto tm = Clock.currTime().toISOExtString();
     writeln(tm, " My Thread Id: ", to!string(thisThreadID));
     // simulate long runnig task
     Thread.sleep(dur!("seconds")(3));

     if (req.path == "/")
         res.writeBody(tm ~ " Hello, World! from " ~ 
to!string(thisThreadID), "text/plain");


Launch two parallel curls.. and here is the server log..

Master 13284 is running
[vibe-6(5fQI) INF] Listening for requests on http://0.0.0.0:8080/
[vibe-7(xljY) INF] Listening for requests on http://0.0.0.0:8080/
[vibe-2(FVCk) INF] Listening for requests on http://0.0.0.0:8080/
[vibe-3(peZP) INF] Listening for requests on http://0.0.0.0:8080/
[vibe-8(c5pQ) INF] Listening for requests on http://0.0.0.0:8080/
[vibe-4(T/oM) INF] Listening for requests on http://0.0.0.0:8080/
[vibe-5(zc5i) INF] Listening for requests on http://0.0.0.0:8080/
[vibe-1(Rdux) INF] Listening for requests on http://0.0.0.0:8080/
[vibe-0(PNMK) INF] Listening for requests on http://0.0.0.0:8080/
2018-05-09T15:32:41.5424275 My Thread Id: 140129463940864
2018-05-09T15:32:44.5450092 My Thread Id: 140129463940864
2018-05-09T15:32:56.3998322 My Thread Id: 140129463940864
2018-05-09T15:32:59.4022579 My Thread Id: 140129463940864
2018-05-09T15:33:12.4973215 My Thread Id: 140129463940864
2018-05-09T15:33:15.4996923 My Thread Id: 140129463940864


PS: Your top posting makes reading your replies difficult


More information about the Digitalmars-d mailing list