교수님 중 한 분은 확장성 문제에 대해 말씀하시며 X 프로토콜이 확장 불가능한 프로토콜의 전형적인 예라고 말씀하셨습니다. 왜 그런 겁니까? 하드웨어에 크게 의존하기 때문일까요? X가 최신 유닉스/리눅스 환경에서 사용된다는 것을 알고 있습니다. X가 확장 가능하지 않다면 왜 그렇게 널리 사용됩니까?
답변1
그가 그렇게 말하는 이유 중 하나는 클라이언트와 서버 사이를 오가는 트래픽을 보면 꽤 장황하기 때문입니다. 트래픽이 그 사이의 단일 상자에서만 로컬로 이동해야 하는 경우에는 문제가 되지 않지만 트래픽이 네트워크 연결을 통해 이동해야 하는 경우 이것이 비효율적인 프로토콜이라는 것이 더욱 분명해집니다.
이 프로토콜은 LAN 네트워크에서 허용되지만 일단 WAN 연결을 통해 이동하거나 VPN 형태로 암호화를 도입하거나 SSH 연결을 클라이언트와 서버 간의 링크로 사용하려고 하면 프로토콜이 실제로 프로토콜의 오류를 보여주기 시작합니다. 확장성이 부족합니다.
벤치마킹
이 도구를 사용하면 x11perf
응용 프로그램을 로컬에서 실행하는 것과 다른 X 시스템에 대한 SSH 연결을 통해 실행하는 것의 영향을 이해할 수 있습니다.
-create
제가 말하는 내용을 맛보기 위해 여기서 테스트를 진행하고 있습니다 .
로컬 호스트
$ x11perf -create
x11perf - X11 performance program, version 1.2
Fedora Project server version 10905000 on :0.0
from grinchy
Mon Sep 16 21:08:28 2013
Sync time adjustment is 0.1340 msecs.
2400 reps @ 0.0134 msec ( 74400.0/sec): Create and map subwindows (4 kids)
2400 reps @ 0.0156 msec ( 64300.0/sec): Create and map subwindows (4 kids)
....
2400 reps @ 0.0119 msec ( 83800.0/sec): Create and map subwindows (100 kids)
12000 trep @ 0.0063 msec (158000.0/sec): Create and map subwindows (100 kids)
....
2400 reps @ 0.0029 msec (349000.0/sec): Create and map subwindows (200 kids)
12000 trep @ 0.0049 msec (205000.0/sec): Create and map subwindows (200 kids)
LAN 호스트
$ ssh skinner "x11perf -create"
....
Sync time adjustment is 1.5461 msecs.
2400 reps @ 0.0270 msec ( 37100.0/sec): Create and map subwindows (4 kids)
2400 reps @ 0.0219 msec ( 45700.0/sec): Create and map subwindows (4 kids)
....
2400 reps @ 0.0168 msec ( 59600.0/sec): Create and map subwindows (100 kids)
12000 trep @ 0.0211 msec ( 47300.0/sec): Create and map subwindows (100 kids)
....
2400 reps @ 0.0159 msec ( 62900.0/sec): Create and map subwindows (200 kids)
12000 trep @ 0.0196 msec ( 50900.0/sec): Create and map subwindows (200 kids)
WAN 호스트
$ ssh catbus-o "x11perf -create"
....
Mon Sep 16 21:12:22 2013
Sync time adjustment is 27.9911 msecs.
2400 reps @ 0.0592 msec ( 16900.0/sec): Create and map subwindows (4 kids)
2400 reps @ 0.0604 msec ( 16600.0/sec): Create and map subwindows (4 kids)
....
2400 reps @ 0.0538 msec ( 18600.0/sec): Create and map subwindows (100 kids)
12000 trep @ 0.0558 msec ( 17900.0/sec): Create and map subwindows (100 kids)
....
2400 reps @ 0.0697 msec ( 14400.0/sec): Create and map subwindows (200 kids)
12000 trep @ 0.0586 msec ( 17100.0/sec): Create and map subwindows (200 kids)
다음 위치에서 극단적인 하락을 참고하세요.
로컬 호스트:
12000 trep @ 0.0049 msec (205000.0/sec): Create and map subwindows (200 kids)
LAN 호스트:
12000 trep @ 0.0196 msec ( 50900.0/sec): Create and map subwindows (200 kids)
WAN 호스트:
12000 trep @ 0.0586 msec ( 17100.0/sec): Create and map subwindows (200 kids)
이는 성능이 급격히 저하되는 것입니다. 이제 그것이 모두 X의 잘못이 아니라는 것을 깨달으십시오. LAN 테스트는 100MB 네트워크를 사용하고 WAN 테스트는 약 20MB 연결을 사용하지만 요점은 동일합니다. X는 X 서버와 X 클라이언트 사이를 오가는 지나치게 강력한 통신에는 도움이 되지 않습니다.
통신 실패(Led Zeppelin 참조에 저항할 수 없음)
x11perf -create
이것은 효과에 더 가깝지만 위에서 사용한 테스트 중에 대략 얼마나 많은 데이터가 앞뒤로 흐르고 있는지 알려드리기 위해 tcpdump
LAN 호스트에서 다시 실행하기로 결정했습니다. SSH 트래픽을 처리하고 파일에 덤프합니다.
나는 다음 명령을 사용했습니다.
$ sudo -i
$ tcpdump -lnni wlan0 -w dump.log -s 65535 host skinner and port ssh
생성된 로그 파일:
$ ll dump.log
-rw-r--r-- 1 root root 5768821 Sep 16 22:30 dump.log
따라서 생성된 최종 트래픽은 약 5.5MB입니다. 물론 이것이 X 트래픽이 전부는 아니지만 트래픽 양에 대한 아이디어를 제공합니다. 이것이 실제로 X의 아킬레스 건이며 확장되지 않는 주된 이유입니다.