[질문] 리눅스 커널 2.6.14의 changelog 중 소켓버퍼 클로닝에
글쓴이: redgauri / 작성시간: 금, 2005/11/11 - 3:44오후
커널 2.6.14의 changelog 중 아래와 같은 내용이 나오는데, 여기서 SKB cloning이 무엇인지 궁금합니다. 제가 알기론 2.6버전대에선 소켓버퍼를 복사하지 않고 각 스택에서 버퍼의 포인터만 복사해서 사용하고 있는 걸로 아는데요. 아래의 내용을 봐서는 SKB를 위한 메모리 활당을 미리 해서 kmalloc() 회수를 줄이겠다는 것으로 이해 됩니다만, 여기 대해서 좀 더 아시는 분 답변 부탁드립니다.
[NET]: Implement SKB fast cloning.
Protocols that make extensive use of SKB cloning, for example TCP, eat at least 2 allocations per packet sent as a result.
To cut the kmalloc() count in half, we implement a pre-allocation scheme wherein we allocate 2 sk_buff objects in advance, then use a simple reference count to free up the memory at the correct time.
Forums:
잘 모릅니다만..;;;일단 해당 패치에 대한 commit log는
잘 모릅니다만..;;;
일단 해당 패치에 대한 commit log는 요기인 듯 합니다. (당연 구글님께서 가르쳐주셨습니다)
말씀하신 대로 struct sk_buff 구조체로 관리하는 패킷 '데이터'는 특별한 이유가 없으면 복사를 하지 않고, 데이터의 각 위치에 대한 포인터만 sk_buff 구조체 내에 저장하여 처리를 합니다. 하지만 (데이터가 아닌) sk_buff 구조체 자체를 복사해야 할 경우가 있을 겁니다. 패킷 데이터는 1개로 유지하면서 그 데이터를 이용하는 sk_buff를 여러 개 만들고서 dev 등의 필드값을 다르게 만들어서 각각을 처리한다거나 하는 경우입니다. 그렇게 sk_buff 구조체를 복제하는 걸 SKB cloning이라고 하나봅니다. 그리고 거기에 사용하는 함수가 skb_clone()이구요. 왜 SKB cloning을 하는가 하는 건 "fgrep skb_clone() * -R"이 가장 잘 설명해줄 것 같습니다:)
기존 구현에서는...
라고 하면 alloc_skb() 안에서 1번, skb_clone() 안에서 1번, 총 2번의 kmem_cache_alloc() 호출이 발생합니다. 하지만 변경된 코드에서는
라고 하면 alloc_skb_fclone()에서 미리 sk_buff 2개만큼의 공간을 할당하기 때문에 skb_clone()에서는 kmem_cache_alloc() 호출이 발생하지 않습니다.
$PWD `date`
감사합니다.큰 도움이 되었습니다.네트워크에 대해서 모르는게 너무
감사합니다.
큰 도움이 되었습니다.
네트워크에 대해서 모르는게 너무 많군요.
내공이 부족함을 절실히 느낍니다. ^^
댓글 달기