서버 모델 제안(동시접속자 多, performance ↑), fork,thread,s

hbsnow의 이미지

현재 상용화해서 사용되고 있는 범용에 서버 모델이 궁금합니다.

많은 수에 client의 접속을 유지하면서 안정성과 높은 performance 를 유지하는 서버 모델이 궁금합니다.
전송데이타는 1M-5M 정도입니다.

kldp를 다 뒤져봤지만 딱 이렇다 하는 모델은 없는것 같습니다.

혹시 경험이 있으신 분이 계시다면
1. fork
2. thread
3. select(poll)
등을 응용해서 작성해보셨다면 동시접속자, 안정성, performance를 대략 말씀해주시는 것도 좋을듯 합니다.

저도 fork, thread, select(poll) 를 이용해서 사용해보았고 각 장단점도 파악할수 있었지만 최상이라고 생각하는 서버모델은 아직이네요..

많은 의견제시가 있었으면 좋겠습니다.

권순선의 이미지

http://bbs.kldp.org/viewtopic.php?t=21772
를 일단 참고해 보세요...

익명 사용자의 이미지

저도 이거 무지 궁굼합니다.

저의 경우 3가지를 조건에 두어 3가지 동시에 사용합니다.

구현 정말로 어렵습니다.

되도록이면 1/2는 회파하며
3번을 위주로 동작하다가 리소스가 증가하면 2번으로 분기...
2번에서 100개 이상의 Thread발생시 1번으로 분기.....

은빛연어의 이미지

목적이나 기능이 무엇인가에 따라서 구조나 성능, 안정성등이 적용된 시스템을 설계한다고 할 수 있습니다. 한 모델을 정해놓고 여러가지 개발에 적용하지는 않죠... 무엇이든 적절한 구조로 설계를 해야 후에 일어날 수 있는 많은 일들에 대해 유연성을 가질수 있기 때문이죠... ^^*

저의 경우를 예를 들면,
fd가 하난데 여러 동시접속자가 사용하고 높은 성능을 요구한다면, thread를 송/수신용으로 뛰우고 select를 사용하는 구조를 생각하구요...
접속 사용자에 따라서 인증/안정성등을 요구한다면, fork 또는 thread를 이용해서 사용자를 관리하고 select를 이용하죠..
지금 예를 든것은 단순히 일반적인 예기이지 어떠한 기능과 목적을 가진 구조를 예를 듯 것이 아니라는 것을 다시 한번 말씀드립니다~~ ^^*

참고되시길....

jolasen의 이미지

윗분 말씀 처럼 목적과 기능에 기인하겠지만
저의 경우 게임서버를 만들었는데 2,3번을 이용합니다.
대략의 구조는 send,receive,character,npc(monster),item,svs 쓰레드로 총 6개의 쓰레드가 돌게 구성되었구요..
현제 클로즈베타라 접속자가 그리 많지 않아 접속자 수가 많을때의 상황을 말씀드릴수는 없지만 제온 2.4듀얼 한서버에 80명정도 접속시 프로그렘의 시퓨점유율은 1%미만이고 트래픽은 2-3메가 정도. 그리고 안정성은...잘 모르겠습니다. 그냥 열심히 버그 잡는수 밖에는...현제 다운 되는 현상은 없습니다..
이쪽으로 좋은 정보 있으시면 공유좀 부탁드립니다 ^^;

hbsnow의 이미지

목적과 기능.. 어렵네요.

음..

서버: 미디어 서버
전송데이타크기 : 대략 100k
동시 접속자수: 1000유저

목적: 일단 안정성, 신뢰성이라고도 하지요.
데이타가 정확하게 전송이 되어야 겠지요.
시간도 고려가 되어야 겠지요.

대략 이 정도 입니다.

datamind의 이미지

저는 3번을 추천합니다. -_-;;
잘 만들면 안정성과 신뢰성이 뛰어나죠..
물론 잘 만들면 퍼포먼스도 다른 모델보다
컨트롤하기가 더 쉽습니다.

ohojang의 이미지

저도 이문제에 대해서 많은 생각했는데 최근의 Posix 라 할수 있는

Async I/O 를 쓰는것이 괜찮을것 같습니다.

리눅스의 경우 커널 2.5 부터 들어가 있는 걸로 알고 있는데

아마 2.6 이면 안정화가 꽤 되어 있을거라고 생각합니다.

시스템 콜 이름이 aio_read , aio_write 뭐 이런식인데

Solaris 같은 경우는 좀 나온지 됐고 리눅스는 위에 처럼 최근에

그리고 또 요즘은 RealTime Signal 을 써서 구현하고 있습니다.

squid 같은 경우도 코드를 RealTime Signal 로 대체하고 있다니 홈페이지

참조하시면 잘 나왔을 것입니다.

purewell의 이미지

사실, 접속자 수만큼 Process나 Thread를 만드는 것은
사용자끼리 관여가 거의 없는 HTTP, FTP, TELNET 같은
데몬인 것 같습니다.

사용자끼리 관여가 높은 게임서버 등에서 접속자 수만큼
Process나 Thread를 만든다면 동기화 하는데 많은
자원을 까먹을 것입니다.

글쎄요... 윗분들 말씀대로 목적에 맞게 잘 섞어서 쓴다면
괜찮을 듯 싶습니다.

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

linuxs의 이미지

관련된 말인지는 모르겠지만,.화공과라 화학반응 속도론생각나네요.
반응속도가 가장 느린게 전체반응속도를 좌우한다는...
제가 의견은 CPU 병목보다는 IO(HDD) Read하는데 병목이 생길것 같네요...

꿈은 이루어진다.

다즐링의 이미지

머니머니해도..

ircd가 짱이죠!!

bsd에선 kqueue

리눅스에선 poll 씁니다. =)

------------------------------------------------------------------------------------------------
Life is in 다즐링

hbsnow의 이미지

게임서버는 주로 어떤 형태를 가져 가나요?

프로세스나 스레드를 쓰지 않는다면 poller를 사용한다는 말입니까?
아님 최소한의 스레드로 나머질 poller로 커버한다는 건가요!

그외 서버는 참 많을거 같습니다.
실무에서 적용한 사례를 알고 싶습니다.

실무자의 조언을 부탁드립니다.

은행 금융권등...

"100k를 client 1000명이 동시접속해서 스트림을 받아간다"

저도 이것 저것 테스트를 해보겠습니다.

어느정도 서버모델에 정리가 되었음 합니다.

sharefeel의 이미지

fork/thread 는 여러개의 태스크를 동시에 돌리겠다는 것이고
select 는 하나의 태스크 내에서 모두 처리하겠다는 겁니다.
(물론 select 후에 worker thread를 둘수도 있지만,
전적으로 I/O 멀티플렉싱에 의존한다고 가정하겠습니다.)

만약 서버가 수행해야 할일이 CPU-bound한 일이라면 select로 가는게 컨텍스트 스위칭 시간을 줄여서 더 좋을 것 같습니다.

반면 멀티스레드나 프로세스가 주는 가장 큰 이점은 역시
I/O-bound job과 CPU-bound job의 오버래핑이 가능하다는 겁니다.
즉 서버가 I/O 를 기다리는 동안 idle 상태로 빠져들지 않고
CPU-bound 스레드의 일을 수행하기 때문에 더 좋은 퍼포먼스를 내게 됩니다.
(만약 select라면 I/O가 끝나길 기다려서 다른 일을 해야하지요..)

서버가 I/O 즉, DB나 file, network의 access가 많다면 fork/thread 방식이 유리할거라 생각합니다.
아.. 당연히 thread / request 나 thread / connection가 좋다는 것은 아닙니다..
중요한 것은 I/O와 CPU의 오버래핑이므로, 오버래핑이 일어날 정도만 워커 스레드를 생성해서 돌려주면 되는 거지요..
그리고 너무나 당연히 스레드 풀도 써야하고..
동기화도 잘게 쪼개서 lock contention 시간이 길지 않도록 설계하셔야겠지요..

쓰고보니 I/O multiplexing + worker thread 모델이 됐네요..

===============
Vas Rel Por

mach의 이미지

* 무미건조해서 추운 얘기 한마디 한다면.
"잘~메서드로(good method) 잘~ 하면 됩니다."

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

linuxs의 이미지

sharefeel wrote:

만약 서버가 수행해야 할일이 CPU-bound한 일이라면 select로 가는게 컨텍스트 스위칭 시간을 줄여서 더 좋을 것 같습니다.

반면 멀티스레드나 프로세스가 주는 가장 큰 이점은 역시
I/O-bound job과 CPU-bound job의 오버래핑이 가능하다는 겁니다.
즉 서버가 I/O 를 기다리는 동안 idle 상태로 빠져들지 않고
CPU-bound 스레드의 일을 수행하기 때문에 더 좋은 퍼포먼스를 내게 됩니다.
(만약 select라면 I/O가 끝나길 기다려서 다른 일을 해야하지요..)

..

그럼 파일에서 읽어서 일정 데이타를 클라이언트쪽에 전송하는데 CPU 능력이 많이 필요한겁니까? CPU는 연산할때 동작한다고 하던데... CPU사용량이 많다는 얘기는 멀 많이 한다고 해야 돼나요? 초보라...^^

꿈은 이루어진다.

mach의 이미지

linuxs wrote:

그럼 파일에서 읽어서 일정 데이타를 클라이언트쪽에 전송하는데 CPU 능력이 많이 필요한겁니까? CPU는 연산할때 동작한다고 하던데... CPU사용량이 많다는 얘기는 멀 많이 한다고 해야 돼나요? 초보라...^^

보통 CPU를 많이 사용한다 함은 ALU의 기능 즉, 연산을 수행하는 경우를 의미합니다. 암호해독, 행열계산, 그래픽처리를 위한 연산, 타격치계산 등등이겠지요. IO는 DMA를 사용할 경우 CPU연산이 DMA콘트롤러에게 버스 사용허가 정도 밖에는 없을테니까요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

alfalf의 이미지

보통 서버들은 많은 경우 CPU가 여러개 있잖아요.
그런경우 무조건 'select'를 이용하면 하나의 CPU에만 부하가 걸리지 않나요?
또, 그럴때 Process(또는 thread)와 select(poll)을 적절히 분배하기도 어렵지 않나요?

hbsnow의 이미지

점점 논문성으로 흘러가는것 같습니다.

실무에서 대입가능한 프로세스 설계 모델이 필요할것을 봅니다.

중수정도라면 실질적으로 활용가능할 그래서 함께 테스트해볼수 있는 실직적 모델이 제시 되었음 좋겠습니다.

예를 들어
1개의 프로세스당 10개의 쓰레드를 만들고 하나의 쓰레드에서 select 로 100씩 관리한다.

1개의 프로세스당 select를 통해 recv 와 send를 쓰레드로 관리한다.

스레드를 500개 생성해 쓰레드 풀로 관리하며 recv와 send를 수행한다.

등등등....

bleu의 이미지

답변을 달았다가 지우고 다시 올립니다..
먼저한 답변을 곰곰히 생각해보니..-_-요즘 내가 먼일을 하고 있나..
하는 회의감..ㅡㅡ"

일단 미디어 서버를 구성하신다면 어떤 서비스를 하는지
알고 싶네요..먼저 말씀을 해드려야하니..일단은 mms나 real서버
쪽의 구성을 예로 들겠습니다..

일단 프로토콜의 형태를 보았을때 미디어 서비스 프로토콜인경우
client의 접속이 있을 경우 control channel 과 data channel을
달리 둡니다.

서비스 과정을 먼저 보면..
1. control channel로의 clinet 접속
2. thread 생성및 client 와의 data channel open(udp)
3. data channel close
4. control channel close
5. thread destroy

이상 보았을때 구성은
- 서비스 접속및 control channel을 위한 listen select
- 실제적 data 서비스를 위한 Thread Pool(가용 Thread 생성및
pc power가 지원한다면 session 이 Thread pool 오버시 더
생성할수 있어야 하겠죠..)

정도가 될것 같습니다.

-.listen channel(select) 관리 의 Thread 하나 정도와
-.연결 세션에 관한 관리 Thread
-.thread pool을 관리할 Thread
-.실제적 서비스 Thread

이정도가 되겠네요.

서비스 형태로는
1.listen channel로의 서비스 연결 요청
2.thread pool에서 get thread
3.연결세션과 get_thread 연결
4.실제적 서비스(udp)

컨트롤및 destroy
1.컨트롤및 destroy ,listen channel에요청
2.세션관리 Thread에서 해당 thread 요청
3.해당 Thread(서비스 Thread)에게 컨트롤 명령(destroy)

간단히 이정도가 될거 같네요..

움 제가 좀 두서가 없는놈이라서..답변이 충분치 않더라도..
이해를..

ps.제가 글재주가 없어서 맨날 보기만 하거든요..ㅡㅡ"이해해주십시오..

datamind의 이미지

음.. 프로세서 하나 만들어서 select 로 돌리는 것이,
쪼금 디자인 하기기 힘들지만, 잘 돌아가게만 만들면 ,,
안정적이고 최적화 하기도 쉽습니다. 쩝 -_-;;;

ddoman의 이미지

저는 네트워크 프밍에 대해 잘 몰릅니다만..
MS플랫폼에서는 Overraped IO와 IOCP가 있는걸로 알고있습니다.

그게 위에서 어떤분이 말씀하신..async_io 관련 함수들인가요?
비슷한 용도일려나..

암튼 MS에서는 IOCP가 select보다 더 나은 대안이라는데..(?????)

궁금해서요.....

hbsnow의 이미지

그래도 많이 가닥을 잡아가는듯 합니다.

.. bleu 님에 디자인 모듈이 가장 눈에 띄네요

먼저 bleu님에 글중에 "연결 세션에 관한 관리 thread" 에 대해 좀더 보충설명을 해주셨을 합니다.

그리고 오픈가능한 소스가 있으신분은 올려 주셨음 싶네요.
특히 bleu님의 소스가 있으면 많은 사람에게 도움이 될듯 싶습니다.
글이 조금 어렵네요 ^^

실무에 적용해서 성공한 케이스가 있으신 분들이 많은 답변과 의견이 있으면 합니다.

bleu의 이미지

글이 논리정연하지 않아 여러모로 죄송합니다.

일단 먼저 실제 사례로서 제가 직접 구현하지는 않은
설계라는것을 먼저 말씀 드려야할것 같습니다.

하지만 비슷한 경우의 session server라는것을 저희회사에서
구현해서 상용화중이며 이를 응용한 case라는 것을 미리
알려드립니다.

글로 몇번 적어 설명을 드리려 했는데 도저히 안되는군요..
-_-원체 그림 그리며 설명하는것을 좋아하다보니..

코드로 outline만 작성해보았습니다.

main_select()
{

create_sock
loop
{
select(socket) //or just loop ^^
{
client_ip = get_clientip
msgid = get_msg_id //or real data
send_to_manage_thread(client_ip,msgid)
}
}
}

manage_thread()
{
loop:
{
select(socket or ipc)
if(get_status_service_from_datastructure(client_ip) == not exist)
{
service_thread = getthread_from_threadpool
node_create_from_datastructure(client_ip,service_thread)
run_service(client_ip)
}
else
{
service_thread = get_thread_info_from_datastructure(client_ip)
sendmsg(service_thread,msgid) //msg or destroy
}
}
}

service_thead()
{
socket_create(client_ip,udp)
send_service_data
}

대충 정신없이 이정도가 되었는데..
단지 이게 미디어 서버라는 가정 아래입니다....
다른 서버라면 분명 틀립니다..ㅡㅡ"

sendmsg에서 사용할수 있는 메세지로는 아무리 봐도..
signal 정도밖에 없을듯 하다는..생각이 듭니다.

좀 허덥한 설명인지 모르겠지만 갑자기 적은거라 많이
부족한점이 있을겁니다.

ps.이상한 부분은 말씀 해주시면 좀더 detail하게 생각해보겠습니다.

hbsnow의 이미지

좀더 세부적으로 알려주시죠

maximus의 이미지

훔.. 보니깐 다윈하고 비슷하군요..

스트림 분야에서는 어느정도 정통화(?) 된 형태 입니다..

물론 그외에서 추가로 많은 부분(plug-in)들이 있습니다만..

의도 하시는 부분은 Darwin 을 분석해 보시면 될듯 합니다..

=================================
:: how about a cup of tea ? ::
=================================

펑키의 이미지

실무라면 오히려 여러분이 상상하시는 것 보다는 훨씬 좋지 않은 상황이 더 일반적입니다. 먼저 은행을 예로 들면 단순한 FORK()입니다. PRE-FORK라던지 거의 적용이 되지 안습니다. 예를 들면 프론앤드쪽은 단순히 FORK를 해서 실시간 사용자를 1개의 서버당 보통 250명 정도 받아 들이고 백엔드쪽에서는 실시간 사용자를 30명(일부러 제한) 정도 받아 들이는게 보통이었던것 같습니다.

제가 제1금융권인 은행은 2군데 저의 서버로 적용했는데 외부에서 접속해 오는 사용자는 윈도우즈 클라이언트입니다. 모든 접속은 뱅킹 거래일 경우 접속을 지속하지만 그외의 거래는 1회성 접속(송/수신)입니다.

서버 모델은 3가지로 해놓아서 관리자가 원하는것을 최적화 해서 사용하게 해놓았습니다.

1. 전형적인 FORK()
2. PRE-FORK(10개를 미리 띄어 놓습니다)
3. THREAD

이것은 접속을 고려해서 생성하고 그 이후 개별 접속에 대해서는 SELECT를 이용해서 어떤 서버의 경우 NON-BLOCK I/O를 적용하거나 어떤 서버에서는 BLOCK I/O를 적용했습니다. 뱅킹 시스템의 경우 시스템적으로는 NON-BLOCK I/O 이지만 비즈니스적으로 BLOCK을 걸어 놓아 사용자가 정보성 거래가 이닌 트렌젝션이 수반되는 거래의 경우 C/S 모두 임의로 BLOCK을 걸어서 사용했습니다. 즉, 지정된 TIME-OUT안에는 다른 동작을 아예하지 못하게 막아 놓았지만 시스템은 NON-BLOCK I/O를 실제 수행합니다. 즉, 이벤트가 클라이언트뿐만 아니라 어느곳에서 어느 상황에서나 발생하게 지원은 하는 것입니다.

은행에서는 기본적으로 THREAD모델을 그리 환영하지는 안았던것 같습니다. 이유는 '검증된것이 없다.', '한번도 시도해 본적 없다.', '잘 모른다' 등등의 이유로.......

하여간 프론앤드쪽에서 1개의 서버당(보통 CPU 4개 짜리로 6개 정도 운영하더군요, AIX와 SOLARIS였습니다) 250 동시 사용자만 처리하고 나머지는 막아 버렸습니다. 가장 커다란 이유는 서버쪽에 탑재되어 있던 다른 서버들의 부하가 너무 컸습니다. 특히나 WEBLOGIC.... 그리고 백앤드쪽은 3대 정도 운영하던데 1대당 30개의 동시 처리로만 유지 해달라고 해서 제쪽에서 막아 놓았습니다.

그리고 은행이 아닌 또 다른곳에서는 동시 접속자는 그리 만치 않지만 개별 접속자의 작업량이 대단히 많아서 전체적으로 PRE-FORK에 SELECT에 NON-BLOCK I/O를 적용해놓았습니다. (주로 커다란 기업 자료를 제출하거나 받아가는 그러한 사이트)

그리고 또 다른곳은 선물거래하는 회사인데 이곳은 MS 레퍼런스 사이트여서 쓰레드만 사용했습니다. (NT에서 개발되었는데 제가 NT를 잘 몰라서 유닉스 같은 NT 프로그램이 되었습니다. 개인적으로 별로 마음에 안들었던 사이트)

대충 이정도 입니다.

즐거운 시간 되세요.
[/list]

펑키의 이미지

그리고 한가지 빠진것이 있는데 자폭 방지입니다. 제가 직접 적용한것은 두군데 은행이지만(지금 만들어 놓은 서버로, 이것은 패키지 형태입니다) 외국계 은행 한곳하고 다른 은행 한군데 더 해보았는데 대부분의 상황이 비즈니스 로직을 모듈화 해놓았습니다.

이유는 조금 합리적인듯 보입니다. 먼저 은행 시스템의 개발이라는것이 이업체/저업체 마구 마구 개발을 합니다. 그래서 합치다 보니 실제 한곳에서 개발한 시스템이라고 해도 1/2/3차 개발 해가지구 2-3년 이상 개발합니다. 그러다 보니 통신 규약이나 이런것이 자연 사라지게 됩니다.

그래서 한가지 업무가 추가 되면 그냥 모듈 형식으로 끼워넣게 만들곤 하던데(저는 카드빼구는 업무는 전혀 모릅니다, 개발자를 위한 시스템만 개발해주구 그냥 나옵니다.) 이때 자폭 방지를 위해 서버 모듈이 fork를 선호하는것도 있는것 같습니다.

하튼 아무개 은행은 경우 스토리를 들어 보니 대외계 시스템이 3개 업체에서 개발된것 같은데 통신 규약이라는것이 거의 존재하지 않아 그 업무를 아는 담당자 이외에는 난수표입니다. 이정도 되면 fork 모델이 그리 나쁘지만은 않은것 같습니다.

또 한가지 시스템이 레이어 7에서 클러스터링 되는 경우가 거의 없는것 같습니다. 즉, 성능적인 면 보다는 안정적인 면에 더 비중을 두구 그보다 사용자가 늘어 나면 기계를 한대 더 도입하는게 일반적이지 않나 생각됩니다.

오히려 기술적인면에서는 게임서버가 월등하지 않을까 생각됩니다. 잠을 놓쳐가지구 이 시간까지 이러구 있네요. 에구..

즐거운 시간 되세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.