Manus에서 모든 스킬 실행
원클릭으로
원클릭으로
원클릭으로 Manus에서 모든 스킬 실행
시작하기io-multiplexing
High-performance I/O multiplexing including epoll, IOCP, kqueue, and io_uring
스타1
포크1
업데이트2025년 12월 30일 11:46
파일 탐색기
7 개 파일SKILL.md
readonly메뉴
High-performance I/O multiplexing including epoll, IOCP, kqueue, and io_uring
Asynchronous programming models including coroutines, async/await, and reactive patterns
Game server communication protocols including gRPC, REST, and custom binary protocols
Efficient data serialization for game networking including Protobuf, FlatBuffers, and custom binary
Game data persistence with player profiles, leaderboards, inventory systems using Redis and PostgreSQL
Game server deployment with Docker, Kubernetes, and global distribution strategies
Game server design patterns including ECS, command pattern, and event sourcing
| name | io-multiplexing |
| description | High-performance I/O multiplexing including epoll, IOCP, kqueue, and io_uring |
| sasmp_version | 1.3.0 |
| version | 2.0.0 |
| bonded_agent | 02-networking-specialist |
| bond_type | PRIMARY_BOND |
| parameters | {"required":["io_model"],"optional":["max_events","timeout_ms"],"validation":{"io_model":{"type":"string","enum":["epoll","iocp","kqueue","io_uring","select"]},"max_events":{"type":"integer","min":64,"max":10000,"default":1024},"timeout_ms":{"type":"integer","min":0,"max":1000,"default":16}}} |
| retry_config | {"max_attempts":1,"fallback":"blocking_io"} |
| observability | {"logging":{"level":"debug","fields":["events_count","wait_time_ms"]},"metrics":[{"name":"io_events_processed","type":"counter"},{"name":"io_wait_duration_ms","type":"histogram"}]} |
Implement high-performance I/O handling for thousands of concurrent connections.
| Model | Platform | Connections | Latency |
|---|---|---|---|
| epoll | Linux | 100K+ | Low |
| kqueue | BSD/macOS | 100K+ | Low |
| IOCP | Windows | 100K+ | Low |
| io_uring | Linux 5.1+ | 1M+ | Lowest |
| select | All | ~1000 | Medium |
#include <sys/epoll.h>
int epollfd = epoll_create1(0);
// Add socket
struct epoll_event ev;
ev.events = EPOLLIN | EPOLLET; // Edge-triggered
ev.data.fd = client_socket;
epoll_ctl(epollfd, EPOLL_CTL_ADD, client_socket, &ev);
// Event loop
struct epoll_event events[MAX_EVENTS];
while (running) {
int nfds = epoll_wait(epollfd, events, MAX_EVENTS, timeout_ms);
for (int i = 0; i < nfds; i++) {
if (events[i].events & EPOLLIN) handleRead(events[i].data.fd);
if (events[i].events & EPOLLOUT) handleWrite(events[i].data.fd);
}
}
#include <liburing.h>
struct io_uring ring;
io_uring_queue_init(256, &ring, 0);
// Submit read
struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
io_uring_prep_recv(sqe, socket_fd, buffer, BUFFER_SIZE, 0);
io_uring_sqe_set_data(sqe, &connection);
io_uring_submit(&ring);
// Reap completions
struct io_uring_cqe *cqe;
io_uring_wait_cqe(&ring, &cqe);
Connection* conn = io_uring_cqe_get_data(cqe);
handleCompletion(conn, cqe->res);
io_uring_cqe_seen(&ring, cqe);
class GameServer {
int epollfd;
void run() {
while (running) {
pollEvents(16); // 16ms = 60 FPS budget
gameTick();
broadcastState();
}
}
void pollEvents(int timeout_ms) {
struct epoll_event events[1024];
int n = epoll_wait(epollfd, events, 1024, timeout_ms);
for (int i = 0; i < n; i++) {
handleEvent(events[i]);
}
}
};
| Error | Root Cause | Solution |
|---|---|---|
| EMFILE | Too many fds | Increase ulimit |
| Missed events | Level-triggered bug | Use edge-triggered |
| Starvation | Unbalanced load | Round-robin |
| High latency | Blocking call | Async everything |
# Check fd limits
ulimit -n
# Monitor fd usage
ls /proc/$(pgrep game-server)/fd | wc -l
# Check epoll stats
cat /proc/$(pgrep game-server)/fdinfo/3
TEST(EpollServer, HandlesMultipleConnections) {
EpollServer server(8080);
vector<TcpClient> clients(100);
for (auto& client : clients) {
client.connect("localhost", 8080);
}
EXPECT_EQ(server.connectionCount(), 100);
}
assets/ - I/O benchmarksreferences/ - Platform guides