swoole v6.0.0 이후로 file io를 위해 liburing 을 사용한다. io_uring 관련된 내용은 아래 게시글 참조.
그런데, liburing이 정상적으로 설치되어 있는데도 불구하고, 다음과 같은 오류가 발생하면서 file io 관련된 php 함수들이
작동하지 않는 문제가 발생하였다.
Iouring::Iouring() (ERRNO 502): Create io_uring failed, the error code is 1
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <liburing.h>
#define QUEUE_DEPTH 1
#define FILE_NAME "/tmp/test_io_uring.txt"
int main() {
struct io_uring ring;
int fd;
// 파일 생성
fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd < 0) {
perror("open");
return 1;
}
// io_uring 초기화
if (io_uring_queue_init(QUEUE_DEPTH, &ring, 0) < 0) {
perror("io_uring_queue_init");
close(fd);
return 1;
}
// SQE (Submission Queue Entry) 생성
struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
if (!sqe) {
fprintf(stderr, "Failed to get SQE\n");
io_uring_queue_exit(&ring);
close(fd);
return 1;
}
char buffer[] = "Hello io_uring!";
struct iovec iov = {
.iov_base = buffer,
.iov_len = strlen(buffer)
};
// io_uring에 쓰기 요청 추가
io_uring_prep_writev(sqe, fd, &iov, 1, 0);
io_uring_submit(&ring);
// 완료 대기
struct io_uring_cqe *cqe;
io_uring_wait_cqe(&ring, &cqe);
// 결과 확인
if (cqe->res < 0) {
fprintf(stderr, "io_uring write failed: %d\n", cqe->res);
} else {
printf("io_uring write success, wrote %d bytes\n", cqe->res);
}
// 정리
io_uring_cqe_seen(&ring, cqe);
io_uring_queue_exit(&ring);
close(fd);
return 0;
}
apk add build-base linux-headers liburing-dev
gcc test_io_uring.c -o test_io_uring -luring
여튼 실행을 해 보고, 다음과 같은 결과가 나오면 정상인데… 이렇게 나오지 않았다.
io_uring write success, wrote 15 bytes
docker run --rm --security-opt seccomp=unconfined alpine ./test_io_uring
version: '3.8'
services:
alpine-container:
image: alpine:latest
container_name: alpine_io_uring
security_opt:
- seccomp=unconfined
# 후략
#swoole-6 #liburing #iouring오류
----------
머루아저씨
✨ Full-stack Developer | 최신 기술 애호가
💻 현개발환경: PHP 8.3, Swoole, MongoDB, Redis, Docker
⚙️ Ubuntu/Linux 환경 & VS Code SSH 기반 작업
📚 "지속 가능한 개발, 효율적인 코드"를 지향합니다.