-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
In some situations a CPU match permits a better spreading of connections, or select targets only for a given cpu. With Remote Packet Steering or multiqueue NIC and appropriate IRQ affinities, we can distribute trafic on available cpus, per session. (all RX packets for a given flow is handled by a given cpu) Some legacy applications being not SMP friendly, one way to scale a server is to run multiple copies of them. Instead of randomly choosing an instance, we can use the cpu number as a key so that softirq handler for a whole instance is running on a single cpu, maximizing cache effects in TCP/UDP stacks. Using NAT for example, a four ways machine might run four copies of server application, using a separate listening port for each instance, but still presenting an unique external port : iptables -t nat -A PREROUTING -p tcp --dport 80 -m cpu --cpu 0 \ -j REDIRECT --to-port 8080 iptables -t nat -A PREROUTING -p tcp --dport 80 -m cpu --cpu 1 \ -j REDIRECT --to-port 8081 iptables -t nat -A PREROUTING -p tcp --dport 80 -m cpu --cpu 2 \ -j REDIRECT --to-port 8082 iptables -t nat -A PREROUTING -p tcp --dport 80 -m cpu --cpu 3 \ -j REDIRECT --to-port 8083 Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Patrick McHardy <kaber@trash.net>
- Loading branch information
Eric Dumazet
authored and
Patrick McHardy
committed
Jul 23, 2010
1 parent
7f1c407
commit e8648a1
Showing
5 changed files
with
86 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
#ifndef _XT_CPU_H | ||
#define _XT_CPU_H | ||
|
||
#include <linux/types.h> | ||
|
||
struct xt_cpu_info { | ||
__u32 cpu; | ||
__u32 invert; | ||
}; | ||
|
||
#endif /*_XT_CPU_H*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
/* Kernel module to match running CPU */ | ||
|
||
/* | ||
* Might be used to distribute connections on several daemons, if | ||
* RPS (Remote Packet Steering) is enabled or NIC is multiqueue capable, | ||
* each RX queue IRQ affined to one CPU (1:1 mapping) | ||
* | ||
*/ | ||
|
||
/* (C) 2010 Eric Dumazet | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#include <linux/module.h> | ||
#include <linux/skbuff.h> | ||
#include <linux/netfilter/xt_cpu.h> | ||
#include <linux/netfilter/x_tables.h> | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_AUTHOR("Eric Dumazet <eric.dumazet@gmail.com>"); | ||
MODULE_DESCRIPTION("Xtables: CPU match"); | ||
|
||
static int cpu_mt_check(const struct xt_mtchk_param *par) | ||
{ | ||
const struct xt_cpu_info *info = par->matchinfo; | ||
|
||
if (info->invert & ~1) | ||
return -EINVAL; | ||
return 0; | ||
} | ||
|
||
static bool cpu_mt(const struct sk_buff *skb, struct xt_action_param *par) | ||
{ | ||
const struct xt_cpu_info *info = par->matchinfo; | ||
|
||
return (info->cpu == smp_processor_id()) ^ info->invert; | ||
} | ||
|
||
static struct xt_match cpu_mt_reg __read_mostly = { | ||
.name = "cpu", | ||
.revision = 0, | ||
.family = NFPROTO_UNSPEC, | ||
.checkentry = cpu_mt_check, | ||
.match = cpu_mt, | ||
.matchsize = sizeof(struct xt_cpu_info), | ||
.me = THIS_MODULE, | ||
}; | ||
|
||
static int __init cpu_mt_init(void) | ||
{ | ||
return xt_register_match(&cpu_mt_reg); | ||
} | ||
|
||
static void __exit cpu_mt_exit(void) | ||
{ | ||
xt_unregister_match(&cpu_mt_reg); | ||
} | ||
|
||
module_init(cpu_mt_init); | ||
module_exit(cpu_mt_exit); |