이 가이드는 대형 머신과 여러 대의 채굴 리그에서 seine를 실행하는 방법을 다룹니다. 코어가 많은 서버에서 seine가 스레드를 배치하는 방식, 서비스 관리자로 헤드리스 실행하는 방법, 그리고 로컬 제어 API, 실시간 이벤트 스트림, Prometheus 메트릭으로 모든 리그를 시작하고 멈추고 모니터링하는 방법을 설명합니다.
seine는 대형 서버를 어떻게 활용합니까?
Linux에서 seine는 채굴 스레드를 NUMA 노드와 각 노드 안의 L3 캐시 그룹에 분산하며, SMT 형제 코어보다 물리 코어마다 스레드 하나를 먼저 배치합니다. 각 스레드는 2 GiB 영역을 할당하기 전에 자신을 코어에 고정하므로 메모리가 스레드 가까이에 할당됩니다. 이것이 기본 동작이므로 따로 설정할 것이 없습니다.
Blocknet의 Argon2id 작업 증명은 대부분이 메모리 트래픽입니다. 모든 스레드가 해시마다 자신의 2 GiB 영역을 채우고 다시 읽기 때문에, 해시레이트는 스레드가 동시에 얼마나 많은 메모리 컨트롤러와 캐시 그룹을 활용하느냐에 달려 있습니다. 그 이유는 Argon2id 해설에서 설명합니다.
스레드가 운영체제의 CPU 순서를 그대로 따르면 목록의 앞쪽 코어부터 채우게 되는데, 이 코어들은 모두 같은 노드와 같은 몇 개의 캐시 그룹에 있습니다. 2노드 EPYC 머신에서 OS 순서로 실행한 8스레드는 모두 노드 0에 배치되었고, 16 GiB에 달하는 영역 거의 전부가 그 노드의 메모리에 있었습니다. seine의 자동 배치는 노드마다 스레드 4개와 약 8 GiB의 영역을 두어 두 노드의 메모리를 동시에 사용했습니다. L3 그룹이 8개인 단일 노드 EPYC 8434P에서는 OS 순서로 실행한 24스레드가 4개 그룹에 6개씩 몰렸습니다. seine는 8개 그룹 모두에 3개씩 배치했습니다.
배치는 프로세스에 주어진 제한을 따릅니다. 프로세스의 CPU 및 메모리 마스크를 존중하므로 taskset, cgroups, 컨테이너 안에서도 동작하며, 허용된 코어만 사용합니다. Windows 네이티브에서도 같은 auto 설정이 SMT 형제 코어보다 물리 코어를 먼저 채웁니다.
NUMA 인식 배치로 얼마나 빨라집니까?
seine 개발자들은 2026년 10월 24일에 동일한 바이너리를 seine의 자동 배치와 일반 OS 순서 고정(--cpu-affinity os), 두 가지 방식으로 짝을 지어 번갈아 실행하며 측정했습니다.
| 머신 | 스레드 | 메모리 페이지 | 자동 배치에 의한 향상 |
|---|---|---|---|
| 2노드 AMD EPYC · Zen 3 (EPYC 7R13, AWS c6a.8xlarge) | 8 | 일반 | +73% |
| 2노드 AMD EPYC · Zen 3 (EPYC 7R13, AWS c6a.8xlarge) | 8 | 2 MiB 휴즈 페이지 | +108% |
| AMD EPYC 서버 (EPYC 8434P, 48코어, L3 그룹 8개) | 24 | 일반 | +16.7% |
번갈아 실행한 모든 쌍에서 자동 배치가 앞섰으며, 전체 측정 방법과 원본 결과는 seine의 대형 서버 가이드와 CPU 최적화 로그에 있습니다.
이 향상은 seine가 머신의 코어 수보다 적은 스레드를 실행할 때 나타납니다. 코어 수가 아니라 RAM이 스레드 수를 정할 때마다 이런 상황이 생깁니다. 스레드 하나에 약 2 GB가 필요하므로 48코어 서버를 모두 채우려면 영역에만 약 96 GB가 필요합니다. 배치 기능은 실행할 수 있는 스레드가 모든 NUMA 노드와 캐시 그룹에 고르게 퍼지도록 합니다.
두 번째 행에서 보듯이 배치와 휴즈 페이지의 효과는 함께 더해집니다. 휴즈 페이지를 예약한다면 스레드가 실행되는 모든 노드에 예약하십시오. 전체 수량이 충분하다고 해서 로컬 페이지가 보장되지는 않기 때문입니다. 페이지 설정은 휴즈 페이지 가이드에서 다루며, Linux에서 각 노드의 2 MiB 풀은 /sys/devices/system/node/node<N>/hugepages/hugepages-2048kB/nr_hugepages에서 설정합니다.
자신의 머신에서 효과를 확인하려면 같은 스레드 수와 같은 페이지 설정으로 auto와 os를 비교하십시오. --cpu-affinity off는 배치를 전적으로 스케줄러에 맡깁니다.
공유 서버의 메모리 여유분
자동 스레드 수 조정은 GPU 예약분과 별도로 전체 RAM의 5%를 비워 둡니다. --cpu-memory-reserve-percent로 바꿀 수 있습니다. 다른 서비스가 메모리를 쓰기 시작하면 seine의 자동 스레드가 영역을 반환하고 메모리가 확보되면 다시 돌아오므로, 채굴이 머신의 나머지 작업에 맞춰 조정됩니다. 튜닝 결과는 머신별로 캐시되며, VM 크기를 바꾼 경우처럼 허용된 CPU 집합이나 NUMA 및 L3 구성이 바뀌면 캐시가 초기화됩니다.
seine를 헤드리스로 실행하려면 어떻게 합니까?
명령줄에 수령 주소와 풀을 전달하십시오. 예를 들어 --address에 주소나 @name을, --pool-url stratum+tcp://bntpool.com:3333을 지정합니다. 그러면 seine는 아무것도 묻지 않고 시작하며, 설정을 데이터 디렉터리에 저장하고, 터미널이 연결되어 있지 않을 때는 일반 로그를 출력하므로 서비스 관리자로 실행할 수 있습니다.
데스크톱에서 seine는 처음 실행할 때 주소와 풀을 묻습니다. 터미널이 연결되지 않은 서버에서는 두 값을 미리 지정하십시오.
./seine --address '@yourname' \
--pool-url stratum+tcp://bntpool.com:3333 \
--pool-worker rack1-node04 \
--data-dir /var/lib/seine
리그 이름(여기서는 rack1-node04)은 풀에서 이 머신이 표시되는 이름입니다. seine는 주소, 풀, 리그 이름을 데이터 디렉터리(기본값 ./seine-data)의 seine.config.json에 저장하므로, 같은 데이터 디렉터리로 다시 실행할 때는 다른 플래그가 필요 없습니다. 기본값인 --ui auto에서는 터미널에서 대시보드를, 그 밖의 환경에서는 일반 로그를 표시합니다. --ui plain은 일반 출력을 강제합니다. 셸 명령어에서는 @name과 $name을 따옴표로 감싸십시오.
Linux에서는 systemd 유닛으로 부팅 시 seine를 시작하고, 종료되면 다시 시작하게 할 수 있습니다.
[Unit]
Description=seine Blocknet miner
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/opt/seine/seine --data-dir /var/lib/seine --address @yourname --pool-url stratum+tcp://bntpool.com:3333 --ui plain
DynamicUser=yes
StateDirectory=seine
Restart=always
[Install]
WantedBy=multi-user.target
seine는 시작할 때 짧은 이름을 주소로 변환하므로 유닛이 네트워크를 기다리도록 했습니다. 각 리그는 채굴하면서 스스로 튜닝하고, 선택한 설정을 자신의 데이터 디렉터리에 저장해 다음 실행에 사용합니다.
API로 seine를 제어하려면 어떻게 합니까?
seine에는 대시보드와 여러 대의 리그를 관리하는 도구를 위한, 실시간 이벤트 스트림과 Prometheus 메트릭을 갖춘 로컬 REST API가 있습니다. 시작하는 방법은 두 가지입니다.
# API only: seine waits for a start request
./seine --service --api-bind 127.0.0.1:9977
# Mine right away and serve the API
./seine --api-server --api-bind 127.0.0.1:9977
--service 모드는 API를 시작하고, 컨트롤러가 POST /v1/miner/start를 보낼 때까지 채굴기를 대기 상태로 둡니다. 이 요청에는 해당 실행에 쓸 주소, 풀, 스레드 수 등의 설정을 담을 수 있습니다. 각 머신이 언제 어떤 설정으로 채굴할지는 컨트롤러가 정합니다.
API 토큰
seine v0.2.23부터 GET /v1/health를 제외한 모든 엔드포인트에 Authorization: Bearer <token>이 필요합니다. seine는 시작할 때마다 데이터 디렉터리의 control-api.cookie에 무작위로 생성한 새 토큰을 쓰며, Unix에서는 소유자만 읽을 수 있고 종료 시 삭제됩니다. 고정된 값이 필요한 관리 도구라면 --api-token으로 토큰을 지정하거나 --api-cookie로 파일 위치를 바꾸십시오. 또한 API는 기본적으로 CORS 헤더를 보내지 않으며, 루프백 주소에 바인딩된 경우 Host가 로컬이 아닌 요청을 거부하므로 방문한 웹사이트가 수령 주소나 설정을 바꿀 수 없습니다.
API는 기본적으로 127.0.0.1:9977에 바인딩됩니다. 다른 인터페이스에 바인딩하려면 --api-allow-unsafe-bind가 필요하므로, 직접 바꾸지 않는 한 API는 머신 안에만 머뭅니다.
export SEINE_API_TOKEN="$(cat seine-data/control-api.cookie)"
curl -s -X POST http://127.0.0.1:9977/v1/miner/start \
-H "Authorization: Bearer $SEINE_API_TOKEN" \
-H 'content-type: application/json' \
-d '{"mode":"pool","mining_address":"@yourname","pool_url":"stratum+tcp://bntpool.com:3333","pool_worker":"rack1-node04"}'
curl -N -H "Authorization: Bearer $SEINE_API_TOKEN" http://127.0.0.1:9977/v1/events/stream
실시간 이벤트
GET /v1/events/stream은 서버 전송 이벤트(SSE) 스트림입니다. 상태 변화, 백엔드 단계, 자동 튜닝 진행 상황과 결과, 찾은 솔루션, 제출 결과를 발생하는 즉시 알려 주므로 대시보드에서 모든 리그를 실시간으로 보여 줄 수 있습니다. 다시 연결한 뒤에는 GET /v1/runtime/state가 현재 상태 전체를 돌려줍니다.
Prometheus 메트릭
GET /metrics는 seine_miner_running, seine_miner_lifecycle_info, seine_miner_submitted_blocks_total, seine_miner_accepted_blocks_total, seine_miner_stale_submits_total 등의 Prometheus 메트릭을 제공합니다. 쿠키는 시작할 때마다 바뀌고 seine를 실행하는 사용자만 읽을 수 있으므로, Prometheus에는 고정 토큰을 주십시오. --api-token으로 seine를 실행하고 같은 값을 Prometheus가 읽을 수 있는 파일에 저장합니다. 그러면 같은 머신의 수집 작업은 다음과 같습니다.
scrape_configs:
- job_name: seine
authorization:
type: Bearer
credentials_file: /etc/prometheus/seine-token
static_configs:
- targets: ['127.0.0.1:9977']
전체 엔드포인트 목록, 요청 스키마, 이벤트 목록은 seine의 제어 API 문서에 있습니다.
리그용 머신 고르기
배치, 헤드리스 실행, API는 타워 한 대에서도 서버 랙에서도 똑같이 동작합니다. 어떤 프로세서가 가장 빠르게 채굴하는지, 스레드당 RAM을 얼마나 장착해야 하는지는 Blocknet 채굴 하드웨어 가이드를 참고하십시오. seine가 처음이라면 Blocknet 채굴 방법부터 시작하십시오.
자주 묻는 질문
seine는 NUMA 서버를 지원합니까?
네. Linux에서 seine의 기본 자동 어피니티는 채굴 스레드를 NUMA 노드와 L3 캐시 그룹에 분산하며, SMT 형제 코어보다 물리 코어에 하나씩 먼저 배치합니다. 각 스레드는 2 GiB 영역을 할당하기 전에 자신을 코어에 고정하므로 메모리가 스레드 가까이에 할당됩니다. 2노드 EPYC 머신에서는 8스레드 기준 해시레이트가 73% 향상되었습니다.
seine를 터미널 없이 백그라운드 서비스로 실행할 수 있습니까?
네. 처음 실행할 때 --address와 --pool-url을 전달하면 seine는 아무것도 묻지 않고 시작하며, 두 값을 데이터 디렉터리의 seine.config.json에 저장하고, 터미널이 연결되어 있지 않으면 일반 로그 출력으로 전환합니다. 그래서 systemd나 자동으로 재시작해 주는 다른 서비스 관리자에서 쉽게 실행할 수 있습니다.
seine는 Prometheus 메트릭을 내보냅니까?
네. --api-server 또는 --service로 seine를 실행하면 로컬 제어 API의 /metrics에서 Prometheus 메트릭을 제공하며, 이 API는 기본적으로 127.0.0.1의 9977 포트에서 수신합니다. 메트릭에는 채굴기 실행 여부, 수명 주기 상태, 제출·승인·스테일(stale) 솔루션 수, 백엔드 격리 정보가 포함됩니다. 수집 요청에는 API 베어러 토큰을 함께 보냅니다.
seine 제어 API는 왜 토큰을 요구합니까?
seine v0.2.23부터 상태 확인을 제외한 모든 제어 API 엔드포인트에 베어러 토큰이 필요하며, 이를 통해 방문한 웹사이트가 수령 주소나 설정을 바꾸지 못하게 막습니다. seine는 시작할 때마다 데이터 디렉터리의 control-api.cookie에 새 토큰을 쓰며, --api-token으로 고정 토큰을 지정할 수도 있습니다.