Hi Yuliang, 

Are you running with dpdk or with tap/af_packet interfaces? As far as I 
remember multithreading for the last two might not work properly. 

Florin

> On Jul 7, 2017, at 5:55 PM, Yuliang Li <yuliang...@yale.edu> wrote:
> 
> I printed 3 thread_index, and all 3 shows the same value: 
> 
> 1. vlib_frame_t's thread_index:
> For each pending frame p: 
> vlib_pending_frame_t *p = nm->pending_frames + i;
> I get the vlib_frame_t f: 
> vlib_frame_t *f = vlib_get_frame (vm, p->frame_index);
> and I print f->thread_index
> 
> 2. vlib_node_runtime_t's thread_indes:
> For each pending frame p, I get its node runtime nr:
> vlib_node_runtime_t *nr = vec_elt_at_index 
> (nm->nodes_by_type[VLIB_NODE_TYPE_INTERNAL], p->node_runtime_index);
> and I print nr->thread_index
> 
> 3. vlib_main_t's thread_index:
> I print vm->thread_index
> 
> 
> On Fri, Jul 7, 2017 at 5:37 PM, Dave Barach (dbarach) <dbar...@cisco.com 
> <mailto:dbar...@cisco.com>> wrote:
> What exactly were you printing? Vlib_pending_frame_t’s don’t have a 
> thread_index field...: <>
>  
> 
>  
> 
> /* A frame pending dispatch by main loop. */
> 
> typedef struct
> 
> {
> 
>   /* Node and runtime for this frame. */
> 
>   u32 node_runtime_index;
> 
>  
> 
>   /* Frame index (in the heap). */
> 
>   u32 frame_index;
> 
>  
> 
>   /* Start of next frames for this node. */
> 
>   u32 next_frame_index;
> 
>  
> 
>   /* Special value for next_frame_index when there is no next frame. */
> 
> #define VLIB_PENDING_FRAME_NO_NEXT_FRAME ((u32) ~0)
> 
> } vlib_pending_frame_t;
> 
>  
> 
> Thanks… Dave
> 
>  
> 
> From: Yuliang Li [mailto:yuliang...@yale.edu <mailto:yuliang...@yale.edu>] 
> Sent: Friday, July 7, 2017 8:04 PM
> To: Dave Barach (dbarach) <dbar...@cisco.com <mailto:dbar...@cisco.com>>
> Cc: vpp-dev@lists.fd.io <mailto:vpp-dev@lists.fd.io>
> Subject: Re: [vpp-dev] set mapping from node to thread
> 
>  
> 
> Hi Dave,
> 
>  
> 
> Thanks for the detailed response. 
> 
>  
> 
> However, from the experiment I did, I see the same packet being processed by 
> two threads. That is why I asked this question. Maybe I made some mistakes, 
> here is what I did:
> 
>  
> 
> - In vlib_main_or_worker_loop function, I print out all pending frames here, 
> as well as the thread_index of them, and the node name.
> 
> - I start the vpp with 4 worker threads, and set up SNAT according to the 
> progressive tutorial <https://wiki.fd.io/view/VPP/Progressive_VPP_Tutorial>.
> 
> - I run iperf that go through the SNAT.
> 
>  
> 
> The printed information shows that, each TCP packet from the inside to the 
> outside of the SNAT will go through the ethernet-input and snat-in2out. But 
> the thread_index at the ethernet-input is 2, while the thread_index at 
> snat-in2out is 1.
> 
>  
> 
> Is the above expected?
> 
>  
> 
> Thanks,
> 
>  
> 
> On Fri, Jul 7, 2017 at 12:22 PM, Dave Barach (dbarach) <dbar...@cisco.com 
> <mailto:dbar...@cisco.com>> wrote:
> 
> Dear Yuliang, <>
>  
> 
> From a high level: vpp creates N identical graph replicas in a multi-core 
> configuration. When practicable, we use hardware RSS hashing to ensure that 
> all packets belonging to a specific flow are processed [in order!] by the 
> same thread / graph replica. In effect, embarrassing parallelism.
> 
>  
> 
> It’s easy enough to hand off packets between threads - see the “handoff-node” 
> - but we avoid that whenever possible.
> 
>  
> 
> Although one could - and I have - divided graph nodes across threads to 
> create pipelines, that scheme needs significant dynamic tuning to handle a 
> traffic pattern change. It’s hard to map nodes onto cores so that each thread 
> in a pipeline uses approximately the same number of clocks/pkt; critical, 
> since pipelines run at the speed of the slowest stage.
> 
>  
> 
> It’s possible to hand off a full frame of packets for less than two 
> clocks/pkt. Unfortunately, that’s the least significant issue. Handing off a 
> packet from one core/thread to another guarantees a bunch of memory/cache 
> subsystem pressure as the system moves packet data and metadata from A to B.  
> 
>  
> 
> HTH... Dave
> 
>  
> 
> From: vpp-dev-boun...@lists.fd.io <mailto:vpp-dev-boun...@lists.fd.io> 
> [mailto:vpp-dev-boun...@lists.fd.io <mailto:vpp-dev-boun...@lists.fd.io>] On 
> Behalf Of Yuliang Li
> Sent: Friday, July 7, 2017 1:14 PM
> To: vpp-dev@lists.fd.io <mailto:vpp-dev@lists.fd.io>
> Subject: [vpp-dev] set mapping from node to thread
> 
>  
> 
> Hi,
> 
>  
> 
> Is there a way to set which node should run on which thread? And is there a 
> command that shows the mapping from nodes to threads?
> 
>  
> 
> Thanks,
> 
> --
> 
> Yuliang Li
> 
> PhD student
> 
> Department of Computer Science
> 
> Yale University
> 
> 
> 
> 
>  
> 
> -- 
> 
> Yuliang Li
> 
> PhD student
> 
> Department of Computer Science
> 
> Yale University
> 
> 
> 
> 
> -- 
> Yuliang Li
> PhD student
> Department of Computer Science
> Yale University
> _______________________________________________
> vpp-dev mailing list
> vpp-dev@lists.fd.io <mailto:vpp-dev@lists.fd.io>
> https://lists.fd.io/mailman/listinfo/vpp-dev 
> <https://lists.fd.io/mailman/listinfo/vpp-dev>
_______________________________________________
vpp-dev mailing list
vpp-dev@lists.fd.io
https://lists.fd.io/mailman/listinfo/vpp-dev

Reply via email to