Thread (5 messages) 5 messages, 2 authors, 2017-09-21

Re: [PATCH] KSM: Replace jhash2 with xxhash

From: Timofey Titovets <hidden>
Date: 2017-09-21 17:36:05

2017-09-21 18:36 GMT+03:00 Andi Kleen [off-list ref]:
Timofey Titovets [off-list ref] writes:
quoted
xxhash much faster then jhash,
ex. for x86_64 host:
PAGE_SIZE: 4096, loop count: 1048576
jhash2:   0xacbc7a5b            time: 1907 ms,  th:  2251.9 MiB/s
xxhash32: 0x570da981            time: 739 ms,   th:  5809.4 MiB/s
xxhash64: 0xa1fa032ab85bbb62    time: 371 ms,   th: 11556.6 MiB/s

xxhash64 on x86_32 work with ~ same speed as jhash2.
xxhash32 on x86_32 work with ~ same speed as for x86_64
Which CPU is that?
Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
---
I've access to some VM (Not KVM) with:
Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz
PAGE_SIZE: 4096, loop count: 1048576
jhash2:   0x15433d14            time: 3661 ms,  th: 1173.144082 MiB/s
xxhash32: 0x3df3de36            time: 1163 ms,  th: 3691.581922 MiB/s
xxhash64: 0x5d9e67755d3c9a6a    time: 715 ms,   th: 6006.628034 MiB/s

As additional info, xxhash work with ~ same as jhash2 speed at 32 byte
input data.
For input smaller than 32 byte, jhash2 win, for input bigger, xxhash win.

quoted
So replace jhash with xxhash,
and use fastest version for current target ARCH.
Can you do some macro-benchmarking too? Something that uses
KSM and show how the performance changes.

You could manually increase the scan rate to make it easier
to see.
Try use that patch with my patch to allow process all VMA on system [1].
I switch sleep_millisecs 20 -> 1

(I use htop to see CPU load of ksmd)

CPU: Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz
For jhash2: ~18%
For xxhash64: ~11%

(i didn't have x86_32 test machine, so by extrapolating values,
so i expect for xxhash32: (18+11)/2 = ~14.5%)

KSM Statistic:
full_scans:481
max_page_sharing:256
merge_across_nodes:1
mode:[always] normal
pages_shared:39
pages_sharing:135
pages_to_scan:100
pages_unshared:4514
pages_volatile:310
run:1
sleep_millisecs:1
stable_node_chains:0
stable_node_chains_prune_millisecs:2000
stable_node_dups:0
use_zero_pages:0
quoted
@@ -51,6 +52,12 @@
 #define DO_NUMA(x)   do { } while (0)
 #endif

+#if BITS_PER_LONG == 64
+typedef      u64     xxhash;
+#else
+typedef      u32     xxhash;
+#endif
This should be in xxhash.h ?
This is a "hack", for compile time chose appropriate hash function.
xxhash ported from upstream code,
upstream version don't do that (IMHO), as this useless in most cases.
That only can be useful for memory only hashes.
Because for persistent data it's obvious to always use one hash type 32/64.
xxhash_t would seem to be a better name.
quoted
-     u32 checksum;
+     xxhash checksum;
      void *addr = kmap_atomic(page);
-     checksum = jhash2(addr, PAGE_SIZE / 4, 17);
+#if BITS_PER_LONG == 64
+     checksum = xxh64(addr, PAGE_SIZE, 0);
+#else
+     checksum = xxh32(addr, PAGE_SIZE, 0);
+#endif
This should also be generic in xxhash.h
This *can* be generic in xxhash.h, when that solution will be used
somewhere in the kernel code, not in the KSM only, not?

Because for now i didn't find other places with "big enough" input
data, to replace jhash2 with xxhash.

-Andi
Thanks.

Links:
1. https://marc.info/?l=linux-mm&m=150539825420373&w=2

-- 
Have a nice day,
Timofey.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help