Hi, I finally finished my "little" packet decoder. Now I am able to decode ether->ipv4->tcp. So I tried to run a few performance tests on a 10GB pcap dump file but I found big problem. Because it is very big file, subroutine from loaded bytecode is being called many times. On my surprise every time it is called it allocates memory. So soon there is not enough memory and linux just kills my program. I am runnig on centos 5, x86_64, custom kernel 2.6.29lb.06. Runcores or flags are not set.

Here is the code:

C code:
#ifdef DEBUG
   for(int i = 0; i < 2; i++) {
#else
   while (1) {
#endif
       retVal = pcap_next_ex(fp, &pktHeader, &pktData);

       // capture file ended
       if (retVal == -2) {
           break;
       }

       if (retVal < 0) {
           printf("Cannot read packet: %s\n", pcap_geterr(fp));
           clean();
           //spravna reakcia?
           return -1;
       }

       // Timeout expired
       if (retVal == 0) {
           continue;
       }

       Parrot_PMC_set_pointer(interp, packet, (void *)pktData);

       /*
        * Parrot_call_sub_ret_int
        * preplni pamat a odstreli ho to
        */
if (Parrot_call_sub_ret_int(interp, sub, "IPII", packet, (int)pktHeader->caplen, load_bytecode)) {
       //if (Parrot_call_sub(interp, sub, "V")) {
           acc_packets++;
       }
       else {
           rej_packets++;
       }
       load_bytecode = 0;

   }

Parrot_call_sub_ret_int(interp, sub, "IPII", packet, (int)pktHeader->caplen, load_bytecode) - this function allocates memory every time it is being called. The code of subroutine is unimportant because I also tried to call empty subroutine with no param and local variables.

Radovan


_______________________________________________
http://lists.parrot.org/mailman/listinfo/parrot-dev

Reply via email to