summaryrefslogtreecommitdiffstats
path: root/azure-pipelines.yml
AgeCommit message (Collapse)Author
2019-11-16tls: enable test on CI (#1779)Taiki Endo
2019-11-08chore: remove rust-toolchain and add minimum supported version check (#1748)Taiki Endo
* remove rust-toolchain * add minimum supported version check
2019-11-08chore: update CI config to test on stable (#1747)Taiki Endo
2019-10-31chore: check each feature works properly (#1695)Taiki Endo
It is hard to maintain features list manually, so use cargo-hack's `--each-feature` flag. And cargo-hack provides a workaround for an issue that dev-dependencies leaking into normal build (`--no-dev-deps` flag), so removed own ci tool. Also, compared to running tests on all features, there is not much advantage in running tests on each feature, so only the default features and all features are tested. If the behavior changes depending on the feature, we need to test it as another job in CI.
2019-10-29sync: move into `tokio` crate (#1705)Carl Lerche
A step towards collapsing Tokio sub crates into a single `tokio` crate (#1318). The sync implementation is now provided by the main `tokio` crate. Functionality can be opted out of by using the various net related feature flags.
2019-10-28executor: move into `tokio` crate (#1702)Carl Lerche
A step towards collapsing Tokio sub crates into a single `tokio` crate (#1318). The executor implementation is now provided by the main `tokio` crate. Functionality can be opted out of by using the various net related feature flags.
2019-10-28net: replace RwLock<Slab> with a lock free slab (#1625)Eliza Weisman
## Motivation The `tokio_net::driver` module currently stores the state associated with scheduled IO resources in a `Slab` implementation from the `slab` crate. Because inserting items into and removing items from `slab::Slab` requires mutable access, the slab must be placed within a `RwLock`. This has the potential to be a performance bottleneck especially in the context of the work-stealing scheduler where tasks and the reactor are often located on the same thread. `tokio-net` currently reimplements the `ShardedRwLock` type from `crossbeam` on top of `parking_lot`'s `RwLock` in an attempt to squeeze as much performance as possible out of the read-write lock around the slab. This introduces several dependencies that are not used elsewhere. ## Solution This branch replaces the `RwLock<Slab>` with a lock-free sharded slab implementation. The sharded slab is based on the concept of _free list sharding_ described by Leijen, Zorn, and de Moura in [_Mimalloc: Free List Sharding in Action_][mimalloc], which describes the implementation of a concurrent memory allocator. In this approach, the slab is sharded so that each thread has its own thread-local list of slab _pages_. Objects are always inserted into the local slab of the thread where the insertion is performed. Therefore, the insert operation needs not be synchronized. However, since objects can be _removed_ from the slab by threads other than the one on which they were inserted, removal operations can still occur concurrently. Therefore, Leijen et al. introduce a concept of _local_ and _global_ free lists. When an object is removed on the same thread it was originally inserted on, it is placed on the local free list; if it is removed on another thread, it goes on the global free list for the heap of the thread from which it originated. To find a free slot to insert into, the local free list is used first; if it is empty, the entire global free list is popped onto the local free list. Since the local free list is only ever accessed by the thread it belongs to, it does not require synchronization at all, and because the global free list is popped from infrequently, the cost of synchronization has a reduced impact. A majority of insertions can occur without any synchronization at all; and removals only require synchronization when an object has left its parent thread. The sharded slab was initially implemented in a separate crate (soon to be released), vendored in-tree to decrease `tokio-net`'s dependencies. Some code from the original implementation was removed or simplified, since it is only necessary to support `tokio-net`'s use case, rather than to provide a fully generic implementation. [mimalloc]: https://www.microsoft.com/en-us/research/uploads/prod/2019/06/mimalloc-tr-v1.pdf ## Performance These graphs were produced by out-of-tree `criterion` benchmarks of the sharded slab implementation. The first shows the results of a benchmark where an increasing number of items are inserted and then removed into a slab concurrently by five threads. It compares the performance of the sharded slab implementation with a `RwLock<slab::Slab>`: <img width="1124" alt="Screen Shot 2019-10-01 at 5 09 49 PM" src="https://user-images.githubusercontent.com/2796466/66078398-cd6c9f80-e516-11e9-9923-0ed6292e8498.png"> The second graph shows the results of a benchmark where an increasing number of items are inserted and then removed by a _single_ thread. It compares the performance of the sharded slab implementation with an `RwLock<slab::Slab>` and a `mut slab::Slab`. <img width="925" alt="Screen Shot 2019-10-01 at 5 13 45 PM" src="https://user-images.githubusercontent.com/2796466/66078469-f0974f00-e516-11e9-95b5-f65f0aa7e494.png"> Note that while the `mut slab::Slab` (i.e. no read-write lock) is (unsurprisingly) faster than the sharded slab in the single-threaded benchmark, the sharded slab outperforms the un-contended `RwLock<slab::Slab>`. This case, where the lock is uncontended and only accessed from a single thread, represents the best case for the current use of `slab` in `tokio-net`, since the lock cannot be conditionally removed in the single-threaded case. These benchmarks demonstrate that, while the sharded approach introduces a small constant-factor overhead, it offers significantly better performance across concurrent accesses. ## Notes This branch removes the following dependencies `tokio-net`: - `parking_lot` - `num_cpus` - `crossbeam_util` - `slab` This branch adds the following dev-dependencies: - `proptest` - `loom` Note that these dev dependencies were used to implement tests for the sharded-slab crate out-of-tree, and were necessary in order to vendor the existing tests. Alternatively, since the implementation is tested externally, we _could_ remove these tests in order to avoid picking up dev-dependencies. However, this means that we should try to ensure that `tokio-net`'s vendored implementation doesn't diverge significantly from upstream's, since it would be missing a majority of its tests. Signed-off-by: Eliza Weisman <eliza@buoyant.io>
2019-10-26io: move into `tokio` crate (#1691)Carl Lerche
A step towards collapsing Tokio sub crates into a single `tokio` crate (#1318). The `io` implementation is now provided by the main `tokio` crate. Functionality can be opted out of by using the various net related feature flags.
2019-10-25net: move into tokio crate (#1683)Carl Lerche
A step towards collapsing Tokio sub crates into a single `tokio` crate (#1318). The `net` implementation is now provided by the main `tokio` crate. Functionality can be opted out of by using the various net related feature flags.
2019-10-22codec: move into tokio-util (#1675)Carl Lerche
Related to #1318, Tokio APIs that are "less stable" are moved into a new `tokio-util` crate. This crate will mirror `tokio` and provide additional APIs that may require a greater rate of breaking changes. As examples require `tokio-util`, they are moved into a separate crate (`examples`). This has the added advantage of being able to avoid example only dependencies in the `tokio` crate.
2019-10-21timer: move `tokio-timer` into `tokio` crate (#1674)Carl Lerche
A step towards collapsing Tokio sub crates into a single `tokio` crate (#1318). The `timer` implementation is now provided by the main `tokio` crate. The `timer` functionality may still be excluded from the build by skipping the `timer` feature flag.
2019-10-21fs: move into `tokio` (#1672)Carl Lerche
A step towards collapsing Tokio sub crates into a single `tokio` crate (#1318). The `fs` implementation is now provided by the main `tokio` crate. The `fs` functionality may still be excluded from the build by skipping the `fs` feature flag.
2019-10-19executor: rewrite the work-stealing thread pool (#1657)Carl Lerche
This patch is a ground up rewrite of the existing work-stealing thread pool. The goal is to reduce overhead while simplifying code when possible. At a high level, the following architectural changes were made: - The local run queues were switched for bounded circle buffer queues. - Reduce cross-thread synchronization. - Refactor task constructs to use a single allocation and always include a join handle (#887). - Simplify logic around putting workers to sleep and waking them up. **Local run queues** Move away from crossbeam's implementation of the Chase-Lev deque. This implementation included unnecessary overhead as it supported capabilities that are not needed for the work-stealing thread pool. Instead, a fixed size circle buffer is used for the local queue. When the local queue is full, half of the tasks contained in it are moved to the global run queue. **Reduce cross-thread synchronization** This is done via many small improvements. Primarily, an upper bound is placed on the number of concurrent stealers. Limiting the number of stealers results in lower contention. Secondly, the rate at which workers are notified and woken up is throttled. This also reduces contention by preventing many threads from racing to steal work. **Refactor task structure** Now that Tokio is able to target a rust version that supports `std::alloc` as well as `std::task`, the pool is able to optimize how the task structure is laid out. Now, a single allocation per task is required and a join handle is always provided enabling the spawner to retrieve the result of the task (#887). **Simplifying logic** When possible, complexity is reduced in the implementation. This is done by using locks and other simpler constructs in cold paths. The set of sleeping workers is now represented as a `Mutex<VecDeque<usize>>`. Instead of optimizing access to this structure, we reduce the amount the pool must access this structure. Secondly, we have (temporarily) removed `threadpool::blocking`. This capability will come back later, but the original implementation was way more complicated than necessary. **Results** The thread pool benchmarks have improved significantly: Old thread pool: ``` test chained_spawn ... bench: 2,019,796 ns/iter (+/- 302,168) test ping_pong ... bench: 1,279,948 ns/iter (+/- 154,365) test spawn_many ... bench: 10,283,608 ns/iter (+/- 1,284,275) test yield_many ... bench: 21,450,748 ns/iter (+/- 1,201,337) ``` New thread pool: ``` test chained_spawn ... bench: 147,943 ns/iter (+/- 6,673) test ping_pong ... bench: 537,744 ns/iter (+/- 20,928) test spawn_many ... bench: 7,454,898 ns/iter (+/- 283,449) test yield_many ... bench: 16,771,113 ns/iter (+/- 733,424) ``` Real-world benchmarks improve significantly as well. This is testing the hyper hello world server using: `wrk -t1 -c50 -d10`: Old scheduler: ``` Running 10s test @ http://127.0.0.1:3000 1 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 371.53us 99.05us 1.97ms 60.53% Req/Sec 114.61k 8.45k 133.85k 67.00% 1139307 requests in 10.00s, 95.61MB read Requests/sec: 113923.19 Transfer/sec: 9.56MB ``` New scheduler: ``` Running 10s test @ http://127.0.0.1:3000 1 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 275.05us 69.81us 1.09ms 73.57% Req/Sec 153.17k 10.68k 171.51k 71.00% 1522671 requests in 10.00s, 127.79MB read Requests/sec: 152258.70 Transfer/sec: 12.78MB ```
2019-10-11tokio: move `signal` and `process` reexports to crate root (#1643)Ivan Petkov
2019-10-07chore: do not trigger CI on std-future branch (#1635)Taiki Endo
2019-09-27chore: move CI to beta (#1615)Jon Gjengset
2019-09-23macros: add build tests for #[tokio::main] and #[tokio::test] (#1591)Taiki Endo
2019-09-19chore: rm tokio-buf (#1574)Carl Lerche
The crate has not been updated and it does not seem like it is a good path forward.
2019-09-13timer: use our own AtomicU64 on targets with target_has_atomic less than 64 ↵Taiki Endo
(#1538)
2019-08-20chore: bump to newer nightly (#1485)Taiki Endo
2019-08-19process: move into the tokio-net crate (#1475)Ivan Petkov
2019-08-18docs: fix all rustdoc warnings (#1474)Ivan Petkov
2019-08-17signal: move into tokio-net (#1463)Carl Lerche
2019-08-16uds: move into tokio-net (#1462)Carl Lerche
2019-08-16chore: rename ui-tests -> build-tests (#1460)Carl Lerche
2019-08-16udp: move tokio-udp into tokio-net (#1459)Carl Lerche
2019-08-15tcp: move tokio-tcp into tokio-net (#1456)Carl Lerche
2019-08-15threadpool: move threadpool into tokio-executor (#1452)Carl Lerche
The threadpool is behind a feature flag. Refs: #1264
2019-08-15reactor: rename tokio-reactor -> tokio-net (#1450)Carl Lerche
* reactor: rename tokio-reactor -> tokio-net This is in preparation for #1264
2019-08-15executor: move current-thread into crate (#1447)Carl Lerche
The `CurrentThread` executor is exposed using a feature flag. Refs: #1264
2019-08-11chore: bump to newer nightly (#1426)Taiki Endo
2019-08-10chore: change default lint level to warning and deny warnings in CI (#1416)Taiki Endo
2019-08-07chore: enable full CI run (#1399)Carl Lerche
* update all tests * fix doc examples * misc API tweaks
2019-08-02io: remove `util` from default features (#1379)Carl Lerche
Sub-crates should require opting into features.
2019-07-29Update process to use std::future (#1343)andy finch
2019-07-26ci: enable clippy lints (#1335)Taiki Endo
2019-07-22chore: bump to newer nightly (#1338)Taiki Endo
2019-07-15tokio: include `async-traits` feature (#1314)Jon Gjengset
The `tokio` facade crate will depend on the `async-traits` feature flag in sub crates.
2019-07-11fs: update to use `std::future` (#1269)andy finch
2019-07-10chore: bump to newer nightly (#1284)Carl Lerche
2019-07-08uds: update to std-future (#1227)Yin Guanhao
2019-07-03signal: migrate to std::futures (#1218)Ivan Petkov
Migrate to std::futures and the futures 0.3 preview and use async/await where possible **Breaking change:** the IoFuture and IoStream definitions used to refer to Box<dyn Future> and Box<dyn Stream>, but now they are defined as Pin<...> versions which are technically breaking. No other breaking or functional changes have been made
2019-07-03ci: scope each tests/examples invocation to a specific crate (#1238)Ivan Petkov
2019-06-30timer: finish updating timer (#1222)Carl Lerche
* timer: restructure feature flags * update timer tests * Add `async-traits` to CI This also disables a buggy `threadpool` test. This test should be fixed in the future. Refs #1225
2019-06-28chore: remove `tokio-trace`, add "Related Projects" to README (#1221)Eliza Weisman
## Motivation The `tokio-trace` and `tokio-trace-core` crates have been renamed to `tracing` and `tracing-core`, and moved to their own repository (`tokio-rs/tracing`). ## Solution This branch removes `tokio-trace` and `tokio-trace-core` from the `tokio` repository. In addition, I've added a "Related Projects" section to the root README, which lists `tracing` (as well as `mio`, and `bytes`) as other libraries maintained by the Tokio project. I thought that this would help folks looking for `tokio-trace` here find it in its new home. In addition, it changes `tokio` to depend on `tracing-core` rather than `tokio-trace-core`. Closes #1159 Signed-off-by: Eliza Weisman <eliza@buoyant.io>
2019-06-27macros: allow configuring runtime used by main macro (#1185)Douman
2019-06-27codec: update to use std-future (#1214)jesskfullwood
Strategy was to - copy the old codec code that was temporarily being stashed in `tokio-io` - modify all the type signatures to use Pin, as literal a translation as possible - fix up the tests likewise This is intended just to get things compiling and passing tests. Beyond that there is surely lots of refactoring that can be done to make things more idiomatic. The docs are unchanged. Closes #1189
2019-06-27chore: format code and enable rustfmt CI task (#1212)Carl Lerche
2019-06-26test: get `cargo test --tests` working (#1205)Carl Lerche
Broken tests are disabled
2019-06-26Update tokio-udp to use std-future (#1199)Yin Guanhao