I2Speed Changelog

Now also supports WolfCrypt for native execution of AES, SHA-256, Curve25519 and random numbers. One bottleneck around the KBucketSet removed. Smaller tweaks.
Bug fix. Faster caching of crypto ciphers. Uses Apache Commons Crypto for a significant speed gain. Include optimized graphics missing from last update.
Bump to mainline 1.5.0. Also smaller efficiency enhancements to the network transports.
2021-06-18 Further optimization of crypto loops. Improved ChaCha, Poly1305, AES, Curve25519, SHA256 and the random number generator. Now as fast as it can get on the Java level. Less, but enough crypto keys and random numbers pregenerated, reduces memory footprint. Mitigated a transient Ratchet high CPU issue. Minor tweaks. Java 16 or Graal VM with Java 16 support now recommended as it contains a SHA256 speedup that helps where I2P uses that indirectly.
2021-05-20 Noticeable CPU savings by optimizing several of the innermost crypto loops. Devs will know what we are talking about: Removed byte-masks from 24 bit shifted ints. Converted loops to straightforward counted for-loops. Those are treated special by the JVM: No safepoints inserted and array bounds-checking optimized.
Bump to mainline 0.9.50. Again lots of smaller CPU savers, most notably dropping Java concurrency features on idempotent methods and the like. Router steered away from peers with high retransmission rates bringing retransmissions down about 50% compared to last release without sacrificing throughput.
Lots of smaller CPU savers and some bug fixes. Also introducing a smart MTU feature for SSU. We use a MTU that is guaranteed to work with all peers, even those that advertise a MTU they can not use, but when they get through to us with larger packets, we use an optimized MTU value equal or near to their size.
All-new SHA256 module with integrated caching brings the biggest speed bump ever for I2Speed. Minimum 10% CPU saved for any load profile.
Bump to mainline 0.9.49. Adds smaller memory footprint for our ultrafast lockfree ring buffers. Further improvements to UDP. As UDP runs much more traffic now you will definitely want Java 15. Next full package to be published when I2P goes 1.0.
Bump to mainline 0.9.48. Smaller tweaks plus rollbacks for features now found in mainline. Remove UDP double ACKing in cases where cost is higher than benefit. Usually hits peers running 0.9.39 or older.
2020-11-03 Reworked the NTCP core engine ("NTCP Pumper"). Saves up to 50% on looping, queueing, system calls, CPU and a little bit of bandwidth. Outbound data processed in much larger chunks. Several smaller tweaks that you will also find in mainline 0.9.48
Smaller tweaks. Most notably solved a SSU MTU bug. Unfortunately your network peers must run a similar fix for this to be fully effective - hope this will go mainline in 0.9.48.
Make further use of the reduced CPU of the new ECIES encryption. NTCP and SSU in/outbound are handled by two threads each including decoding of inbound local traffic. Outbound local traffic has been reverted to one thread per I2CP client. This saves further CPU and provides speed gains. On ARM32 we handle > 2 MBps in-/out for each NTCP and SSU and > 1 MBps for every local client.
As load patterns shifted with the new crypto along with higher transfer speeds, some new bottlenecks came up and have been adressed, most notably the handling of replies for delivery of outbound messages.
2020-08-28 Change the new crypto to also use CPU-optimized crypto key pregeneration. Remove some features that have been integrated into I2P mainline. Several smaller tweaks. Do not longer ship installers with optimized binaries as those are only needed for ElGamal backward compatibility now.
2020-05-22 Released codebase that will go into the next mainline I2P release. Moved searches and crypto key pregeneration onto the job queue, where they are executed when no more network traffic is queued. Several smaller tweaks to reduce locking and context switches.
Now moved all functions reading inbound traffic from local apps as well as the net to a single central prioritized thread pool. All those functions may invoke lengthy ElGamal processing and may stumble over locks in the single high-level send function awkwardly named "GetBids". This way we aim to prevent preemption by shortly exceeding CPU capacity and reduce blocking while processing a send. Result: Further reduction of context switches. Single peer top speeds now > 900 KBps for TCP and > 600 KBps for UDP on Raspberry class machines.
  • FragmentHandler now operating fully parallized and lockless
  • Replaced some queues and caches with ultra fast lockless ring buffers
  • Stats module made lockless (introducing possible one-off inaccuracy)
  • found a way to make NTCP reading truly parallel
  • tweaks to use of concurrent maps and queues where eating too much CPU
  • several smaller improvements, notably using the double check idiom, one item caches and spinlocks.
2020-03-05 Last small speedup to the thread pools. Introduce pregeneration and lockless retrieval of most frequently used random number types. Was frequently blocking threads on every random bit. Fix I2P concurrency issues in the FragmentHandler.
small tweaks to the thread pools. Enable full parallel inbound processing on NTCP. If idle threads are available, inbound messages are now only queued up behind small messages (1K or less) currently processed instead of time based logic before. Further improves metrics a bit. Download from front page or through our update mechanism. Updated source.
  • Updated to latest I2P version
  • Tweaked our three thread pools a bit that run through the expensive ElGamal encryption/decryption. Remove last instances where ElGamal could effectively block processing for some time. Reported ElGamal times will slightly go up because they start to preempt each other on a busy machine when parallization is improved.
  • restored ElGamal reporting on /stats
  • wrapper.config now includes our recommendations where possible
  • small bug fixes
Our base release. See Technical Overview and Developer corner.

<-- Back