---
title: 配置指南
date: 2021-11-26 14:00:00
author: ihciah
---

# 配置指南

本节将介绍 Monoio 内部的可配置选项和一些默认行为。

## 运行时配置
目前版本下，在运行时你可以改动的主要有 3 个配置：
1. entries

    entries 指 io_uring 的 ring 大小，默认是 `1024`，你可以在创建 runtime 时指定该值。注意，为了保证性能，当设定小于 256 时会设置为 256。当你的 QPS 较高时，设置较大的 entries 可以增大 ring 的大小，减少 submit 次数，这样会显著降低 syscall 占用，但也会带来一定内存占用，请合理设置。

    这个 entries 也会影响 inflight op 缓存的初始大小，默认为 `10 * entries`，目前不提供自定义接口。同样，为了避免这个缓存频繁扩容，请合理设置 entries。

    创建 runtime 时指定：
    ```rust
    RuntimeBuilder::new().with_entries(32768).build()
    ```
    通过宏指定：
    ```rust
    #[monoio::main(entries = 32768)]
    async main() {
        // ...
    }
    ```

2. enable_timer

    enable_timer 指是否启用定时器，默认不开启。如果你有异步计时需求，需要开启该功能，否则会 panic。

    哪些属于异步计时需求？即需要用到本 crate 的 time 包的时候，如异步 sleep 或者 tick 等。简单地调用标准库获取当前时间并不包括在内。

    创建 runtime 时指定：
    ```rust
    RuntimeBuilder::new().enable_timer().build()
    ```
    通过宏指定：
    ```rust
    #[monoio::main(timer_enabled = true)]
    async main() {
        // ...
    }
    ```

3. worker_threads

    要充分利用多核心性能，只能启动多个线程。通常情况下，你可以通过宏来隐式地做这件事。

    在宏中，使用 `worker_threads` 可以手动指定线程数（不指定的时候会以单线程运行）。指定为 `n` 的时候会启动 `n - 1` 个线程并在每个线程创建 Runtime 并执行；之后在主线程也创建 Runtime 并执行，执行完毕等待其他线程。

    宏的功能实现较为简单，如果你需要在创建线程时做一些自定义行为，如绑定 cpu，你就只能手动创建线程和 Runtime 啦。
    ```rust
    #[monoio::main(worker_threads = 2)]
    async main() {
        // ...
    }
    ```

## 编译期配置
在编译期也有一些 feature 会影响 runtime 行为。
1. async-cancel

    async-cancel 默认开启。开启该 feature 后会在 Future 被 Drop 时向 io_uring 推入一个 CancelOp 来试图取消对应 Op，可能有一定的性能提升。注意，即便如此我们也并不能保证这个 Op 一定被取消。所以如果你有类似 select {读，超时} 的行为，如果你后续仍需要继续读取，请务必保存这个 Future。

2. zero-copy

    zero-copy 默认不开启。开启后会在创建 socket 时对该 socket 开启 SOCK_ZEROCOPY 标记，并在 send 时额外添加 MSG_ZEROCOPY 标记。可以减少内存拷贝，但在我们的测试中并不稳定。如果你要开启这个 feature，请确认在压力测试下系统表现正常。

3. macros

    macros 默认开启。开启该 feature 后你可以使用宏来替代 `RuntimeBuilder` 的构造函数，如 `#[monoio::main]`。

4. sync

    sync 默认不开启。这个 feature 允许你在不同线程的 Runtime 间共享 Future。如最常见的需求是，创建一个跨线程的 channel，并通过它实现线程间的通信。作为一个 thread per core 模型的 runtime，不建议在热路径上大量使用这种方式。

5. utils

    utils 默认开启。目前只有一个工具，可以允许你设置线程和 cpu 的 affinity。

6. debug

    debug 默认不开启。开启后会在运行时打印一些调试信息。仅供 Runtime 开发时调试用，不建议在生产环境开启。
