evt 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9466e3fd37da9807dc59525feebfe9252489a460a83111febf95973ff77fee56
4
- data.tar.gz: 531808277a49049dc156144294346730a457d717699e091348125086dca529de
3
+ metadata.gz: 2a40fa492b119e2e67823ab476e39454de3027efbfab820c5d38a4562314f43a
4
+ data.tar.gz: 357b5b8d9c00ca7ed7df013aa6826e5ec85e72f329009272eaf985d7db519abf
5
5
  SHA512:
6
- metadata.gz: c12a241295309fd31bf21bc4957374a636ff046b6aa1c5f670113f0cdeedb3df74f974145ba6f19f9e442d5f8d9ae373d70bfee6ae417dc09e9b620d57bcc78f
7
- data.tar.gz: b3a369c7640d4770a89e7d37166930a757ca25266132fbd0544f2f0a065670de1c13578ea4cf7fc43ad1fb2c2020757b20cc972e85c23cab720bb229103fb070
6
+ metadata.gz: '09cf37c36d93a8fa0144a324934055ede6063203f506af41fcd6a2dd8ebeb0509ff5996726ab92badac63e020b1b56301d18eed967c7fa830286aafde1b38001'
7
+ data.tar.gz: 869b7f1d95960362d2049ebfddb3a18fdad4a2558f64d27f7e5306f57025592a2402086f2ded46291a95f0fd4fe200f9040e83a449e29a61e0245e25e8f8d1ad
@@ -12,13 +12,13 @@ jobs:
12
12
  fail-fast: false
13
13
  matrix:
14
14
  include:
15
- - { os: ubuntu-20.04, ruby: '3.0' }
16
- - { os: ubuntu-20.04, ruby: ruby-head }
17
- - { os: macos-11.0, ruby: '3.0' }
18
- - { os: macos-11.0, ruby: ruby-head }
19
- - { os: windows-2019, ruby: mingw }
20
- - { os: windows-2019, ruby: mswin }
21
- name: ${{ matrix.os }} ${{ matrix.ruby }}
15
+ - { os: ubuntu-20.04, ruby: '3.0', backend: epoll }
16
+ - { os: ubuntu-20.04, ruby: '3.0', backend: ruby, disable-epoll: 1 }
17
+ - { os: macos-11.0, ruby: '3.0', backend: kqueue }
18
+ - { os: macos-11.0, ruby: '3.0', backend: ruby, disable-kqueue: 1 }
19
+ - { os: windows-2019, ruby: mingw, backend: ruby }
20
+ - { os: windows-2019, ruby: mswin, backend: ruby }
21
+ name: test ${{ matrix.os }} ${{ matrix.ruby }} ${{ matrix.backend }}
22
22
  runs-on: ${{ matrix.os }}
23
23
  timeout-minutes: 5
24
24
  steps:
@@ -32,6 +32,9 @@ jobs:
32
32
  gem install bundler
33
33
  bundle install --jobs 4 --retry 3
34
34
  - name: Compile
35
+ env:
36
+ DISABLE_EPOLL: ${{ matrix.disable-epoll }}
37
+ DISABLE_KQUEUE: ${{ matrix.disable-kqueue }}
35
38
  run: rake compile
36
39
  - name: Test
37
40
  run: rake
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Evt
2
2
 
3
- The Event Library that designed for Ruby 3.0.
3
+ The Event Library that designed for Ruby 3.0 Fiber Scheduler.
4
4
 
5
5
  **This gem is still under development, APIs and features are not stable. Advices and PRs are highly welcome.**
6
6
 
@@ -10,8 +10,6 @@ The Event Library that designed for Ruby 3.0.
10
10
 
11
11
  ## Features
12
12
 
13
-
14
-
15
13
  ### IO Backend Support
16
14
 
17
15
  | | Linux | Windows | macOS | FreeBSD |
@@ -28,6 +26,22 @@ The Event Library that designed for Ruby 3.0.
28
26
  4. Some I/Os are not able to be nonblock under Windows. See [Scheduler Docs](https://docs.ruby-lang.org/en/master/doc/scheduler_md.html#label-IO).
29
27
  5. `kqueue` performance in Darwin is very poor. **MAY BE DISABLED IN THE FUTURE.**
30
28
 
29
+ ### Benchmark
30
+
31
+ The benchmark is running under `v0.2.2` version. See [evt-server-benchmark](https://github.com/dsh0416/evt-server-benchmark) for test code, the test is running under a single-thread server.
32
+
33
+ The test command is `wrk -t4 -c8192 -d30s http://localhost:3001`.
34
+
35
+ All of the systems have set their file descriptor limit to maximum.
36
+
37
+ | OS | CPU | Memory | Backend | req/s |
38
+ | ----- | ----------- | ------ | ---------------------- | -------- |
39
+ | Linux | Ryzen 2700x | 64GB | epoll | 54680.08 |
40
+ | Linux | Ryzen 2700x | 64GB | io_uring | 50245.53 |
41
+ | Linux | Ryzen 2700x | 64GB | IO.select (using poll) | 44159.23 |
42
+ | macOS | i7-6820HQ | 16GB | kqueue | 37855.53 |
43
+ | macOS | i7-6820HQ | 16GB | IO.select (using poll) | 28293.36 |
44
+
31
45
  ## Install
32
46
 
33
47
  ```bash
@@ -68,6 +82,7 @@ scheduler.run
68
82
  - [x] Support iov features of io_uring
69
83
  - [x] Support IOCP (**NOT ENABLED YET**)
70
84
  - [x] Setup tests with Ruby 3
85
+ - [x] Selectable backend compilation by environment variable
71
86
  - [ ] Support IOCP with iov features
72
87
  - [ ] Setup more tests for production purpose
73
88
  - [ ] Documentation for usages
@@ -6,11 +6,11 @@ Gem::Specification.new do |spec|
6
6
  spec.authors = ["Delton Ding"]
7
7
  spec.email = ["dsh0416@gmail.com"]
8
8
 
9
- spec.summary = "A low-level Event Handler designed for Ruby 3 Scheduler"
9
+ spec.summary = "The Event Library that designed for Ruby 3.0 Fiber Scheluer."
10
10
  spec.description = "A low-level Event Handler designed for Ruby 3 Scheduler for better performance"
11
11
  spec.homepage = "https://github.com/dsh0416/evt"
12
12
  spec.license = 'BSD-3-Clause'
13
- spec.required_ruby_version = '>= 2.8.0.dev'
13
+ spec.required_ruby_version = '>= 3.0.0.rc1'
14
14
 
15
15
  spec.metadata["homepage_uri"] = spec.homepage
16
16
  spec.metadata["source_code_uri"] = "https://github.com/dsh0416/evt"
@@ -56,7 +56,7 @@ VALUE method_scheduler_wait(VALUE self) {
56
56
  timeout = NUM2INT(next_timeout);
57
57
  }
58
58
 
59
- struct epoll_event* events = (struct epoll_event*) xmalloc(sizeof(struct epoll_event) * EPOLL_MAX_EVENTS);
59
+ struct epoll_event events[EPOLL_MAX_EVENTS];
60
60
 
61
61
  n = epoll_wait(epfd, events, EPOLL_MAX_EVENTS, timeout);
62
62
  if (n < 0) {
@@ -79,8 +79,6 @@ VALUE method_scheduler_wait(VALUE self) {
79
79
  result = rb_ary_new2(2);
80
80
  rb_ary_store(result, 0, readables);
81
81
  rb_ary_store(result, 1, writables);
82
-
83
- xfree(events);
84
82
  return result;
85
83
  }
86
84
 
@@ -30,5 +30,7 @@ void Init_evt_ext()
30
30
  #elif HAVE_WINDOWS_H
31
31
  #include "select.h"
32
32
  // #include "iocp.h"
33
+ #else
34
+ #include "select.h"
33
35
  #endif
34
36
  #endif
@@ -2,11 +2,22 @@ require 'mkmf'
2
2
  extension_name = 'evt_ext'
3
3
  dir_config(extension_name)
4
4
 
5
- have_library('uring')
6
- have_header('liburing.h')
7
- have_header('sys/epoll.h')
8
- have_header('sys/event.h')
9
- have_header('Windows.h')
5
+ def env_defined?(v)
6
+ return false if ENV[v].nil?
7
+ return false if ENV[v].empty?
8
+ return false if ENV[v].upcase == 'FALSE'
9
+ return false if ENV[v] == '0'
10
+ true
11
+ end
12
+
13
+ unless env_defined?('DISABLE_URING')
14
+ have_library('uring')
15
+ have_header('liburing.h')
16
+ end
17
+
18
+ have_header('sys/epoll.h') unless env_defined?('DISABLE_EPOLL')
19
+ have_header('sys/event.h') unless env_defined?('DISABLE_KQUEUE')
20
+ have_header('Windows.h') unless env_defined?('DISABLE_IOCP')
10
21
 
11
22
  create_header
12
23
  create_makefile(extension_name)
@@ -27,26 +27,20 @@ VALUE method_scheduler_register(VALUE self, VALUE io, VALUE interest) {
27
27
  event_flags |= EVFILT_WRITE;
28
28
  }
29
29
 
30
- EV_SET(&event, fd, event_flags, EV_ADD|EV_ENABLE, 0, 0, (void*) io);
30
+ EV_SET(&event, fd, event_flags, EV_ADD|EV_ENABLE|EV_ONESHOT, 0, 0, (void*) io);
31
31
  kevent(kq, &event, 1, NULL, 0, NULL); // TODO: Check the return value
32
32
  return Qnil;
33
33
  }
34
34
 
35
35
  VALUE method_scheduler_deregister(VALUE self, VALUE io) {
36
- struct kevent event;
37
- ID id_fileno = rb_intern("fileno");
38
- int kq = NUM2INT(rb_iv_get(self, "@kq"));
39
- int fd = NUM2INT(rb_funcall(io, id_fileno, 0));
40
- EV_SET(&event, fd, 0, EV_DELETE, 0, 0, (void*) io);
41
- kevent(kq, &event, 1, NULL, 0, (void*) io); // TODO: Check the return value
36
+ // One-shot mode
42
37
  return Qnil;
43
38
  }
44
39
 
45
40
  VALUE method_scheduler_wait(VALUE self) {
46
41
  int n, kq, i;
47
42
  u_short event_flags = 0;
48
-
49
- struct kevent* events; // Event Triggered
43
+ struct kevent events[KQUEUE_MAX_EVENTS];
50
44
  struct timespec timeout;
51
45
  VALUE next_timeout, obj_io, readables, writables, result;
52
46
  ID id_next_timeout = rb_intern("next_timeout");
@@ -57,8 +51,6 @@ VALUE method_scheduler_wait(VALUE self) {
57
51
  readables = rb_ary_new();
58
52
  writables = rb_ary_new();
59
53
 
60
- events = (struct kevent*) xmalloc(sizeof(struct kevent) * KQUEUE_MAX_EVENTS);
61
-
62
54
  if (next_timeout == Qnil || NUM2INT(next_timeout) == -1) {
63
55
  n = kevent(kq, NULL, 0, events, KQUEUE_MAX_EVENTS, NULL);
64
56
  } else {
@@ -85,7 +77,6 @@ VALUE method_scheduler_wait(VALUE self) {
85
77
  rb_ary_store(result, 0, readables);
86
78
  rb_ary_store(result, 1, writables);
87
79
 
88
- xfree(events);
89
80
  return result;
90
81
  }
91
82
 
@@ -101,6 +101,7 @@ VALUE method_scheduler_wait(VALUE self) {
101
101
  } else {
102
102
  rb_funcall(iovs, id_push, 1, obj_io);
103
103
  }
104
+ io_uring_cqe_seen(ring, cqes[i]);
104
105
  }
105
106
 
106
107
  if (ret == 0) {
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Evt
4
- VERSION = "0.2.1"
4
+ VERSION = "0.2.2"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delton Ding
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-21 00:00:00.000000000 Z
11
+ date: 2020-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -65,7 +65,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 2.8.0.dev
68
+ version: 3.0.0.rc1
69
69
  required_rubygems_version: !ruby/object:Gem::Requirement
70
70
  requirements:
71
71
  - - ">="
@@ -75,5 +75,5 @@ requirements: []
75
75
  rubygems_version: 3.2.2
76
76
  signing_key:
77
77
  specification_version: 4
78
- summary: A low-level Event Handler designed for Ruby 3 Scheduler
78
+ summary: The Event Library that designed for Ruby 3.0 Fiber Scheluer.
79
79
  test_files: []