tl;dr
- CIFS(삼바), NFS, (내용추가)iSCSI 등은 파일 I/O 단위가 아닌 블록 단위 기반 프로토콜임
- 이런 프로토콜들은 네트워크 지연이 높아지면(LFN) 가용 대역폭이 높다 하더라도 프로토콜 설계 한계(command queue length)로 인한 병목이 있음
- 단순히 command queue의 길이를 늘려 해결할 수 없는 복잡한 문제임(bufferbloat)
- 따라서 장거리 프로젝트 협업에는 이런 블록 기반 네트워크 파일시스템이 적합하지 않으며, 다른 애플리케이션 계층 프로토콜을 사용해야 함
- 대안으로 Git 자체 프로토콜과 WebDav 등이 있다
- WebDav는 안타깝게도 윈도 지원이 열악한 문제가 있다
// 특히 M$가 explorer.exe에 WebDav 지원을 뺀 이유는 단순히 OneDrive의 매출을 올리기 위한 수작으로 보는 의견이 있음
배경
이 글은 내가 해외로 이주하면서, 여전히 한국에 거주하고 있는 사람들과 취미/취업 프로젝트 협업을 어떻게 이어나갈지 고민하며 쓴 메일에서 발췌한 것이다. 참고로 그 프로젝트는 결국 다들 취업이 되고, 인생을 다르게 살면서 흐지부지 되었다.
내 개인적인 생각은 여전히 그 프로젝트를 언젠간 프로토타이핑(MVP)를 해보는게 좋겠다는 것이다. 카카오가 한국 사회의 IM(instant messaging) 시장을 장악한 상황은 절대로 지속가능하지 않다는 것은 당연한 사실임.
- PSGM: MVP 이전 프로젝트 내부 코드명인 “Portfolio Study Group Messenger”
Git 프로토콜을 통한 repo 접근
Git은 파일 시스템 primitive (flock(2) 등)을 사용해서 동작할 수 있도록 설계되어서, 로컬 폴더 뿐만 아니라 윈도 공유 폴더나 NFS로도 별로 서버 프로그램 없이 pull/push 할 수 있도록 되어 있다. 그래서 PSG 프로젝트의 git repo 들을 별로 데몬을 돌려서 서비스하지 않고 있었지만, 이제 프로잭트가 국제 협업으로 되다보니 당면한 문제가 있다: 블록 기반 네트워크 파일 시스템은 지연이 심한 환경(150ms+)에서 사용하기 곤란하다는 것.
유럽과 Seoul 간에 100Mbps 이상의 상시 가용 대역폭이 있음에도 불구하고 CIFS 업다운 대역폭은 1Mbps도 나오지 않았다. 인터넷을 찾아보니 NFS나 CIFS는 iSCSI와 같이 블록단위 IO 트렌젝션이 이루어져야 하는 설계 때문에, 패킷 왕복 지연이 심하면 사용이 거의 불가능 하다는게 공론이라고 함.
가장 시급한 사항은 git repo 접근이었다. GIt 프로토콜의 단순한 설계와 블록단위 트렌젝션이 아닌 애플리케이션 레이어 TCP/IP 스트리밍 전송임에 왕복 지연이 큰 문제가 되지 않아 Git 데몬을 구축하기로 하였다.
리눅스 CIFS 구현체는 다 FUSE가 아닌 커널 드라이버로 되어있어서 네트워크가 불안정하거나 상황에 따라서 마운트보다 VPN이 먼저 꺼지거나 하면 시스템이 불안정해지는 문제가 있다. 이번 기회로 이런 협업 프로젝트를 진행하면서 CIFS나 NFS 대신 애플리케이션 레이어 기반 프로토콜인 WebDav 등을 사용하여 파일공유 솔루션을 구축해야 한다는 교훈을 얻었다… 문제는 쓰기 좋은 FOSS WebDav 구현체가 나와있지 않다는게 문제. 따라서 삼바 서비스는 계속 유지할 계획이다.
사용법
굳이 공유폴더에 접근할 이유가 없고, git repo만 접근해야 하는 상황에서는 삼바 공유폴더를 연결/마운트 할 필요 없이 VPN 연결 만으로 git 프로토콜을 사용해 repo를 사용할 수 있도록 git daemon을 구축하였다.
간단하게 //REDACTED/repo-a/git에 있는 폴더를 git://smb.REDACTED/로 접근할 수 있다. 예를 들면:
/media/psg/repo-a/git/psgmmobile를 git://smb.REDACTED/psgmmobile로 변경하여 사용하면 된다.
git remote set-url origin 'git://smb.REDACTED/psgmmobile'설정 백서
서버에 어떻게 설정했는지 기술함.
systemctl status git-psgSystemd 서비스 유닛 파일은 /usr/local/lib/systemd/system/git-psg.service:
[Unit]
Description=Git Daemon for PSG
[Service]
ExecStart=/usr/bin/git daemon --reuseaddr --export-all --enable=receive-pack --base-path=REDACTED REDACTED
Restart=always
RestartSec=500ms
User=psg
Group=psg
[Install]
WantedBy=multi-user.target--reuseaddr: sockopt (프로그램이 얼마나 오래됐는지 알 수 있음)--export-all: 별도 설정 없이REDACTED안에있는 모든 repo를 서비스함--enable=receive-pack: 클라이언트가 push 할 수 있도록 함. Git 프로토콜은 인증(로그인) 기능이 없어, 인터넷에 개방할 때는 대부분 read-only 미러링용으로 사용하는게 대부분이다. 우리는 VPN 위에서 서비스하기 때문에 어느 클라이언트든 자유롭게 push 할 수 있도록 설정할 수 있다Restart=always,RestartSec=500ms: 데몬이 죽으면 자동으로 다시 시작User=psg,Group=psg: 데몬이 공유폴더 UID, GID를 사용하도록 하기 위함
http-backend를 사용하지 않은 이유
git-http-backend, nginx, cgi를 사용해서 http로 빼려 했으나, git-http-backend의 보안 패치 때문에 Git 데몬을 사용하는 것보다 설정이 더 복잡하여 포기하였다.
어차피 Git 데몬은 단일 프로세스 서비스라 reliable 하지 않는 문제가 있지만, 메모리 footprint가 적고 설정이 간편하다는 장점이 더 커서(특히 클라우드 환경해서) http 서비스는 포기하였음.
COLOPHON
🐦
Du, lilla sparvöga, flyg över ängarna
Dröm dina drömmar så länge du känner liv
Känner liv…
😥
Signed-off-by: David Timber
Acked-by: 0
| DATE | COMMIT | MSG |
|---|---|---|
| 2024-07-07 | d6e4672f91ef | on-git-over-lfn: initial commit |