routing cache hash table 조절하는 방법..

지나가는새의 이미지

커널 메세지 중에,

IP: routing cache hash table of 512 buckets, 4Kbytes

와 같은 메세지가 나옵니다.

사실, 박스가 라우터도 아니고, 엣지단에 붙어 있기 때문에 4K의 테이블은 좀 넘친다는 생각이 듭니다.(브릿지로 사용하고 있습니다)

제가 궁금한것은,

1. 저 4K를 줄이려면 어떤 방법으로 해야 하는지

2. 저 4K를 만약에 줄인다면(1K나.. 등으로) 그 나머지가 커널이 사용하는 메모리로 옮겨 지는지 알고 싶습니다.

3. 1번에 관련되어 net/ipv4/route.c의 코드를 보면

   goal = num_physpages >> (26 - PAGE_SHIFT);
   
   for (order = 0; (1UL << order) < goal; order++)
        /* NOTHING */;

    do {
        rt_hash_mask = (1UL << order) * PAGE_SIZE /
            sizeof(struct rt_hash_bucket);
        while (rt_hash_mask & (rt_hash_mask - 1))
            rt_hash_mask--;
        rt_hash_table = (struct rt_hash_bucket *)
            __get_free_pages(GFP_ATOMIC, order);
    } while (rt_hash_table == NULL && --order > 0);

의 식으로 PAGE_SHIFT가 중요한 인자로 사용되는데요, 저 PAGH_SHIFT가 정확히 어떠한 인자로 사용되는지 가늠이 안됩니다.

/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT  12
#define PAGE_SIZE   (1L << PAGE_SHIFT)
#define PAGE_MASK   (~(PAGE_SIZE-1))

로 정의 되어 있지만 상당히 많은 부분(사실상 페이징에 관련된 거의 모든 곳)에 사용되는거 같은데요, 정확히 저 SHIFT라는 것의 정의가 어떻게 사용되는지 감이 오질 않네요. (대부분 arg >> ( x - PAGE_SHIFT)로 사용되더군요)

도움 부탁 합니다.

kernel version 2.4.18, network configuration

 <*> Packet socket                                               
 [ ]   Packet socket: mmapped IO                                 
 <M> Netlink device emulation                                    
 [*] Network packet filtering (replaces ipchains)                
 [ ]   Network packet filtering debugging                        
 [*] Socket Filtering                                            
 <*> Unix domain sockets                                         
 [*] TCP/IP networking                                           
 [ ]   IP: multicasting                                          
 [ ]   IP: advanced router                                       
 [ ]   IP: kernel level autoconfiguration                        
 < >   IP: tunneling                                             
 < >   IP: GRE tunnels over IP                                   
 [ ]   IP: ARP daemon support (EXPERIMENTAL)                     
 [ ]   IP: TCP Explicit Congestion Notification support          
 [ ]   IP: TCP syncookie support (disabled per default)          
 IP: Netfilter Configuration  --->                               
 < >   The IPv6 protocol (EXPERIMENTAL)                          
 < >   Kernel httpd acceleration (EXPERIMENTAL)                  
 [ ] Asynchronous Transfer Mode (ATM) (EXPERIMENTAL)             
 <M> 802.1Q VLAN Support (EXPERIMENTAL)                          
 ---                                                             
 < > The IPX protocol                                            
 < > Appletalk protocol support                                  
 < > DECnet Support                                              
 <M> 802.1d Ethernet Bridging                                    
 < > CCITT X.25 Packet Layer (EXPERIMENTAL)                      
 < > LAPB Data Link Driver (EXPERIMENTAL)                        
 [ ] 802.2 LLC (EXPERIMENTAL)                                    
 [ ] Frame Diverter (EXPERIMENTAL)                               
 < > Acorn Econet/AUN protocols (EXPERIMENTAL)                   
 < > WAN router                                                  
 [ ] Fast switching (read help!)                                 
 [ ] Forwarding between high speed interfaces                    
 QoS and/or fair queueing  --->
pastime의 이미지

rt_hash_table 은 __get_free_pages() 함수를 이용하여 할당받기 때문에
페이지 크기 이하로는 할당이 불가능합니다.

rt_hash_table = (struct rt_hash_bucket *)
            __get_free_pages(GFP_ATOMIC, order); 

PAGE_SHIFT 매크로는 페이지의 크기를 결정하는 값으로
PAGE_SIZE 는 2 의 PAGE_SHIFT 승의 크기를 가집니다.
위에서 PAGE_SHIFT 는 12 이므로 PAGE_SIZE 는 4096, 즉 4k 가 됩니다.