Skip to content

Instantly share code, notes, and snippets.

@dasl-
Last active June 28, 2023 15:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dasl-/455dce2b1291787ba6f155237ed7f651 to your computer and use it in GitHub Desktop.
Save dasl-/455dce2b1291787ba6f155237ed7f651 to your computer and use it in GitHub Desktop.
  1. start memcached listening on TCP port 11212 and UDP port 11213: /usr/bin/memcached -u memcached -p 11212 -U 11213 -m 64 -c 1024 -R 256 -t 4
  2. Run mc_tcp_vs_udp.php script and observe that setting keys is slightly faster via UDP: php mc_tcp_vs_udp.php:
Setting 100 keys via TCP...
Setting 100 keys via TCP took 4.86524 ms
Getting keys: tcp_0, tcp_100 ...
array(2) {
  ["tcp_0"]=>
  string(1) "0"
  ["tcp_100"]=>
  string(3) "100"
}
Setting 100 keys via UDP...
Setting 100 keys via UDP took 0.89574 ms
Getting keys: udp_0, udp_100 ...
array(2) {
  ["udp_0"]=>
  string(1) "0"
  ["udp_100"]=>
  string(3) "100"
}
  1. Restart the memcached process we started in (1) to clear the cache contents
  2. Add 100 ms of delay to all traffic on loopback network interface: sudo tc qdisc add dev lo root netem delay 100ms
  3. Run mc_tcp_vs_udp.php script and observe that setting keys is much faster via UDP: php mc_tcp_vs_udp.php:
Setting 100 keys via TCP...
Setting 100 keys via TCP took 20226.504976 ms
Getting keys: tcp_0, tcp_100 ...
array(2) {
  ["tcp_0"]=>
  string(1) "0"
  ["tcp_100"]=>
  string(3) "100"
}
Setting 100 keys via UDP...
Setting 100 keys via UDP took 0.447725 ms
Getting keys: udp_0, udp_100 ...
array(2) {
  ["udp_0"]=>
  string(1) "0"
  ["udp_100"]=>
  string(3) "100"
}
  1. Delete the network delay rules we added: sudo tc qdisc del dev lo root
<?php
$mc_tcp = new Memcached();
$mc_tcp->addServer('localhost', 11212);
$mc_tcp->get('foo'); // issue a GET to force a connection to memcached to be created
$max = 100;
echo "Setting $max keys via TCP...\n";
$start = hrtime(true);
for ($i = 0; $i <= $max; $i++) {
$key = "tcp_{$i}";
$mc_tcp->set($key, "$i");
}
$elapsed_ms = (hrtime(true) - $start) / 1e6;
echo "Setting $max keys via TCP took $elapsed_ms ms\n";
$keys = ["tcp_0", "tcp_{$max}"];
echo "Getting keys: " . implode(", ", $keys) . " ...\n";
var_dump($mc_tcp->getMulti($keys));
$mc_udp = new Memcached();
$mc_udp->setOption(Memcached::OPT_USE_UDP, true);
$mc_udp->addServer('localhost', 11213);
$mc_udp->set('foo', 'bar'); // issue a SET to force a connection to memcached to be created (UDP does not support gets)
echo "Setting $max keys via UDP...\n";
$start = hrtime(true);
for ($i = 0; $i <= $max; $i++) {
$key = "udp_{$i}";
$mc_udp->set($key, "$i");
}
$elapsed_ms = (hrtime(true) - $start) / 1e6;
echo "Setting $max keys via UDP took $elapsed_ms ms\n";
$keys = ["udp_0", "udp_{$max}"];
echo "Getting keys: " . implode(", ", $keys) . " ...\n";
var_dump($mc_tcp->getMulti($keys)); // UDP does not support gets
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment