feat(info): add thread CPU time measurement for worker thread monitoring (#3379) ## Summary This PR introduces worker thread CPU time monitoring to identify bottlenecks and fixes precision issues in process CPU time calculations. ## Problem Statement 1. **Lack of granular thread monitoring**: The current `INFO` command provides only overall process CPU time, which includes background threads. This makes it difficult to identify bottlenecks in worker threads specifically, as background thread activity can mask true worker thread utilization. 2. **Precision loss in CPU time calculation**: The existing CPU time calculation truncates microsecond values due to integer division (`tv_usec / 1000000`), causing millisecond data loss. This results in inaccurate reporting, especially for short operations where sub-second precision matters. ## Solution ### 1. Worker Thread CPU Time Monitoring - Added new `worker_cpu_time` metric to track CPU usage per worker thread - Implemented per-thread CPU time collection using platform-specific APIs - Formatted output with microsecond precision (6 decimal places) to match system precision - Sample output: `worker_cpu_time:[0.123456,0.456789,1.234567]` ### 2. CPU Time Calculation Fix - Fixed precision loss in `used_cpu_user` and `used_cpu_sys` calculations - Replaced integer division with floating point division: **Before**: `tv_usec / 1000000` → truncates to integer **After**: `static_cast<double>(tv_usec) / 1e6` → preserves microseconds ## Benefits - **Pinpoint worker thread bottlenecks**: Isolate worker thread CPU usage from background threads - **Accurate performance analysis**: Microsecond-precision timing enables precise performance profiling - **Better load diagnosis**: Distinguish between actual worker saturation and background activity --------- Co-authored-by: yxj25245 <yxj25245@ly.com>
Apache Kvrocks is a distributed key value NoSQL database that uses RocksDB as storage engine and is compatible with Redis protocol. Kvrocks intends to decrease the cost of memory and increase the capacity while compared to Redis. The design of replication and storage was inspired by rocksplicator and blackwidow.
Kvrocks has the following key features:
You can find Kvrocks users at the Users page.
Users are encouraged to add themselves to the Users page. Either leave a comment on the “Who is using Kvrocks” issue, or directly send a pull request to add company or organization information and logo.
# Ubuntu / Debian sudo apt update sudo apt install -y git build-essential cmake libtool python3 libssl-dev # CentOS / RedHat sudo yum install -y centos-release-scl-rh sudo yum install -y git devtoolset-11 autoconf automake libtool libstdc++-static python3 openssl-devel # download and install cmake via https://cmake.org/download wget https://github.com/Kitware/CMake/releases/download/v3.26.4/cmake-3.26.4-linux-x86_64.sh -O cmake.sh sudo bash cmake.sh --skip-license --prefix=/usr # enable gcc and make in devtoolset-11 source /opt/rh/devtoolset-11/enable # openSUSE / SUSE Linux Enterprise sudo zypper install -y gcc11 gcc11-c++ make wget git autoconf automake python3 curl cmake # Arch Linux sudo pacman -Sy --noconfirm autoconf automake python3 git wget which cmake make gcc # macOS brew install git cmake autoconf automake libtool openssl # please link openssl by force if it still cannot be found after installing brew link --force openssl
It is as simple as:
$ git clone https://github.com/apache/kvrocks.git $ cd kvrocks $ ./x.py build # `./x.py build -h` to check more options
To build with TLS support, you'll need OpenSSL development libraries (e.g. libssl-dev on Debian/Ubuntu) and run:
$ ./x.py build -DENABLE_OPENSSL=ON
To build with lua instead of luaJIT, run:
$ ./x.py build -DENABLE_LUAJIT=OFF
Build with debug mode, run:
# The default build type is RelWithDebInfo and its optimization level is typically -O2. # You can change it to -O0 in debug mode. $ ./x.py build -DCMAKE_BUILD_TYPE=Debug
$ ./build/kvrocks -c kvrocks.conf
$ docker run -it -p 6666:6666 apache/kvrocks --bind 0.0.0.0 # or get the nightly image: $ docker run -it -p 6666:6666 apache/kvrocks:nightly
Please visit Apache Kvrocks on DockerHub for additional details about images.
$ redis-cli -p 6666 127.0.0.1:6666> get a (nil)
$ ./x.py build --unittest $ ./x.py test cpp # run C++ unit tests $ ./x.py test go # run Golang (unit and integration) test cases
Namespace is used to isolate data between users. Unlike all the Redis databases can be visited by requirepass, we use one token per namespace. requirepass is regraded as admin token, and only admin token allows to access the namespace command, as well as some commands like config, slaveof, bgsave, etc. See the Namespace page for more details.
# add token 127.0.0.1:6666> namespace add ns1 my_token OK # update token 127.0.0.1:6666> namespace set ns1 new_token OK # list namespace 127.0.0.1:6666> namespace get * 1) "ns1" 2) "new_token" 3) "__namespace" 4) "foobared" # delete namespace 127.0.0.1:6666> namespace del ns1 OK
Kvrocks implements a proxyless centralized cluster solution but its accessing method is completely compatible with Redis cluster clients. You can use Redis cluster SDKs to access the kvrocks cluster. For more details, please refer to Kvrocks Cluster Introduction.
Documents are hosted at the official website.
kvrocks2redis built via ./x.py buildKvrocks community welcomes all forms of contribution and you can find out how to get involved on the Community and How to Contribute pages.
Apache Kvrocks is licensed under the Apache License Version 2.0. See LICENSE and NOTICE for details.