@@ -30,14 +30,14 @@ MOCK_TASKSET="${MOCK_TASKSET:-4,5}" # CPUs for mock server
3030# Handoff server configuration
3131SERVER_PORT=" ${SERVER_PORT:- 8081} "
3232SERVER_THREADS=" ${SERVER_THREADS:- 2} "
33- SERVER_USE_CUSTOM_SCHEDULER=" ${SERVER_USE_CUSTOM_SCHEDULER:- false} "
3433SERVER_IO=" ${SERVER_IO:- epoll} "
3534SERVER_TASKSET=" ${SERVER_TASKSET:- 2,3} " # CPUs for handoff server
3635SERVER_JVM_ARGS=" ${SERVER_JVM_ARGS:- } "
37- SERVER_POLLER_MODE=" ${SERVER_POLLER_MODE:- 3 } " # jdk.pollerMode value (1, 2, or 3)
36+ SERVER_POLLER_MODE=" ${SERVER_POLLER_MODE:- } " # jdk.pollerMode value (1, 2, or 3); empty = JVM default, NETTY_SCHEDULER defaults to 3
3837SERVER_FJ_PARALLELISM=" ${SERVER_FJ_PARALLELISM:- } " # ForkJoinPool parallelism (empty = JVM default)
39- SERVER_NO_TIMEOUT=" ${SERVER_NO_TIMEOUT:- false} " # Disable HTTP client timeout
40- SERVER_REACTIVE=" ${SERVER_REACTIVE:- false} " # Use reactive handler with Project Reactor
38+ SERVER_FJ_AFFINITY=" ${SERVER_FJ_AFFINITY:- false} " # ForkJoinPool virtual thread scheduler affinity
39+ SERVER_MODE=" ${SERVER_MODE:- NON_VIRTUAL_NETTY} " # Server mode: NON_VIRTUAL_NETTY, REACTIVE, VIRTUAL_NETTY
40+ SERVER_MOCKLESS=" ${SERVER_MOCKLESS:- false} " # Skip mock server; do Jackson work inline
4141
4242# Load generator configuration
4343LOAD_GEN_TASKSET=" ${LOAD_GEN_TASKSET:- 0,1} " # CPUs for load generator
@@ -57,6 +57,7 @@ PROFILING_DURATION_SECONDS="${PROFILING_DURATION_SECONDS:-10}"
5757# Profiling configuration
5858ENABLE_PROFILER=" ${ENABLE_PROFILER:- false} "
5959PROFILER_EVENT=" ${PROFILER_EVENT:- cpu} "
60+ PROFILER_FORMAT=" ${PROFILER_FORMAT:- flamegraph} " # Output format: flamegraph, collapsed, jfr
6061PROFILER_OUTPUT=" ${PROFILER_OUTPUT:- profile.html} "
6162ASYNC_PROFILER_PATH=" ${ASYNC_PROFILER_PATH:- } " # Path to async-profiler
6263
@@ -382,15 +383,27 @@ start_handoff_server() {
382383 jvm_args=" $jvm_args -XX:-DoJVMTIVirtualThreadTransitions"
383384 jvm_args=" $jvm_args -Djdk.trackAllThreads=false"
384385
385- if [[ " $SERVER_USE_CUSTOM_SCHEDULER " == " true" ]]; then
386- jvm_args=" $jvm_args -Djdk.virtualThreadScheduler.implClass=io.netty.loom.NettyScheduler"
387- jvm_args=" $jvm_args -Djdk.pollerMode=$SERVER_POLLER_MODE "
386+ # Mode-specific JVM args
387+ local poller_mode=" $SERVER_POLLER_MODE "
388+ case " $SERVER_MODE " in
389+ NETTY_SCHEDULER)
390+ jvm_args=" $jvm_args -Djdk.virtualThreadScheduler.implClass=io.netty.loom.NettyScheduler"
391+ # Default pollerMode to 3 for custom scheduler if not explicitly set
392+ poller_mode=" ${poller_mode:- 3} "
393+ ;;
394+ esac
395+
396+ # Apply pollerMode if set (explicitly or via mode default)
397+ if [[ -n " $poller_mode " ]]; then
398+ jvm_args=" $jvm_args -Djdk.pollerMode=$poller_mode "
388399 fi
389400
390401 if [[ -n " $SERVER_FJ_PARALLELISM " ]]; then
391402 jvm_args=" $jvm_args -Djdk.virtualThreadScheduler.parallelism=$SERVER_FJ_PARALLELISM "
392403 fi
393404
405+ jvm_args=" $jvm_args -Djdk.virtualThreadScheduler.affinity=$SERVER_FJ_AFFINITY "
406+
394407 # Add debug non-safepoints if profiling is enabled
395408 if [[ " $ENABLE_PROFILER " == " true" ]]; then
396409 jvm_args=" $jvm_args -XX:+UnlockDiagnosticVMOptions"
@@ -402,15 +415,19 @@ start_handoff_server() {
402415 jvm_args=" $jvm_args $SERVER_JVM_ARGS "
403416 fi
404417
418+ local mockless_flag=" "
419+ if [[ " $SERVER_MOCKLESS " == " true" ]]; then
420+ mockless_flag=" --mockless"
421+ fi
422+
405423 local cmd=" $taskset_cmd $java_cmd $JAVA_OPTS $jvm_args -cp $RUNNER_JAR \
406424 io.netty.loom.benchmark.runner.HandoffHttpServer \
407425 --port $SERVER_PORT \
408426 --mock-url http://localhost:$MOCK_PORT /fruits \
409427 --threads $SERVER_THREADS \
410- --use-custom-scheduler $SERVER_USE_CUSTOM_SCHEDULER \
411428 --io $SERVER_IO \
412- --no-timeout $SERVER_NO_TIMEOUT \
413- --reactive $SERVER_REACTIVE \
429+ --mode $SERVER_MODE \
430+ $mockless_flag \
414431 --silent"
415432
416433 log " Handoff server command: $cmd "
@@ -467,7 +484,8 @@ start_profiler() {
467484
468485 (
469486 sleep " $PROFILING_DELAY_SECONDS "
470- " $asprof " --threads -e " $PROFILER_EVENT " -o flamegraph -d " $PROFILING_DURATION_SECONDS " -f " $output_file " " $SERVER_PID "
487+ # --record-cpu
488+ " $asprof " --threads -e " $PROFILER_EVENT " -o " $PROFILER_FORMAT " -d " $PROFILING_DURATION_SECONDS " -f " $output_file " " $SERVER_PID "
471489 ) &
472490 PROFILER_PID=$!
473491
@@ -700,12 +718,12 @@ print_config() {
700718 log " Handoff Server:"
701719 log " Port: $SERVER_PORT "
702720 log " Threads: $SERVER_THREADS "
703- log " Reactive : $SERVER_REACTIVE "
704- log " Custom Sched : $SERVER_USE_CUSTOM_SCHEDULER "
721+ log " Mode : $SERVER_MODE "
722+ log " Mockless : $SERVER_MOCKLESS "
705723 log " I/O Type: $SERVER_IO "
706- log " No Timeout: $SERVER_NO_TIMEOUT "
707724 log " Poller Mode: $SERVER_POLLER_MODE "
708725 log " FJ Parallelism: ${SERVER_FJ_PARALLELISM:- <default>} "
726+ log " FJ Affinity: $SERVER_FJ_AFFINITY "
709727 log " CPU Affinity: ${SERVER_TASKSET:- <none>} "
710728 log " Extra JVM Args: ${SERVER_JVM_ARGS:- <none>} "
711729 log " "
@@ -786,14 +804,14 @@ Mock Server:
786804Handoff Server:
787805 SERVER_PORT Server port (default: 8081)
788806 SERVER_THREADS Number of event loop threads (default: 2)
789- SERVER_REACTIVE Use reactive handler with Reactor (default: false )
790- SERVER_USE_CUSTOM_SCHEDULER Use custom Netty scheduler (default: false)
807+ SERVER_MODE Server mode: NON_VIRTUAL_NETTY, REACTIVE, VIRTUAL_NETTY, NETTY_SCHEDULER (default: NON_VIRTUAL_NETTY )
808+ SERVER_MOCKLESS Skip mock server; do Jackson work inline (default: false)
791809 SERVER_IO I/O type: epoll, nio, or io_uring (default: epoll)
792- SERVER_NO_TIMEOUT Disable HTTP client timeout (default: false)
793810 SERVER_TASKSET CPU affinity range (default: "2,3")
794811 SERVER_JVM_ARGS Additional JVM arguments
795812 SERVER_POLLER_MODE jdk.pollerMode value: 1, 2, or 3 (default: 3)
796813 SERVER_FJ_PARALLELISM ForkJoinPool parallelism (empty = JVM default)
814+ SERVER_FJ_AFFINITY ForkJoinPool scheduler affinity (default: false)
797815
798816Load Generator:
799817 LOAD_GEN_CONNECTIONS Number of connections (default: 100)
@@ -847,8 +865,8 @@ General:
847865
848866Examples:
849867
850- # Basic run with custom scheduler
851- JAVA_HOME=/path/to/jdk SERVER_USE_CUSTOM_SCHEDULER=true ./run-benchmark.sh
868+ # Custom scheduler mode
869+ JAVA_HOME=/path/to/jdk SERVER_MODE=NETTY_SCHEDULER ./run-benchmark.sh
852870
853871 # Run with CPU pinning and profiling
854872 JAVA_HOME=/path/to/jdk \
@@ -866,12 +884,24 @@ Examples:
866884 WARMUP_DURATION=15s \
867885 ./run-benchmark.sh
868886
869- # Reactive handler test
887+ # Reactive mode
888+ JAVA_HOME=/path/to/jdk \
889+ SERVER_MODE=REACTIVE \
890+ SERVER_THREADS=2 \
891+ ./run-benchmark.sh
892+
893+ # Netty on ForkJoinPool mode
870894 JAVA_HOME=/path/to/jdk \
871- SERVER_REACTIVE=true \
895+ SERVER_MODE=VIRTUAL_NETTY \
872896 SERVER_THREADS=2 \
873897 ./run-benchmark.sh
874898
899+ # Mockless mode (no mock server, inline Jackson work)
900+ JAVA_HOME=/path/to/jdk \
901+ SERVER_MODE=VIRTUAL_NETTY \
902+ SERVER_MOCKLESS=true \
903+ SERVER_THREADS=2 \
904+ ./run-benchmark.sh
875905EOF
876906 exit 0
877907 ;;
898928 build_jars
899929
900930 # Start servers
901- start_mock_server
931+ if [[ " $SERVER_MOCKLESS " != " true" ]]; then
932+ start_mock_server
933+ else
934+ log " Mockless mode: skipping mock server"
935+ fi
902936 start_handoff_server
903937
904938 # Run warmup (no profiling/pidstat)
0 commit comments