Copy disabled (too large)
Download .txt
Showing preview only (10,225K chars total). Download the full file to get everything.
Repository: parsa-epfl/cloudsuite
Branch: main
Commit: c9d7584b9f4f
Files: 356
Total size: 86.5 MB
Directory structure:
gitextract_ld6tfyvy/
├── .github/
│ ├── scripts/
│ │ └── build-images.sh
│ └── workflows/
│ ├── build-images.yaml
│ └── spell-check.yaml
├── .gitignore
├── .spellcheck.yml
├── .wordlist.txt
├── LICENSE.md
├── README.md
├── benchmarks/
│ ├── data-analytics/
│ │ └── latest/
│ │ ├── Dockerfile
│ │ └── files/
│ │ ├── benchmark.sh
│ │ ├── categories
│ │ ├── docker-entrypoint.py
│ │ └── mahout-examples-0.13.0-job.jar
│ ├── data-caching/
│ │ ├── client/
│ │ │ ├── Dockerfile
│ │ │ └── docker-entrypoint.sh
│ │ └── server/
│ │ └── Dockerfile
│ ├── data-serving/
│ │ ├── .gitignore
│ │ ├── client/
│ │ │ ├── Dockerfile
│ │ │ ├── load.sh
│ │ │ ├── setup_tables.txt
│ │ │ └── warmup.sh
│ │ └── server/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ └── docker-entrypoint.py
│ ├── data-serving-relational/
│ │ ├── client/
│ │ │ ├── Dockerfile
│ │ │ ├── docker-entrypoint.py
│ │ │ └── template/
│ │ │ ├── database.conf
│ │ │ ├── oltp-rw.py
│ │ │ └── tpcc.py
│ │ └── server/
│ │ ├── Dockerfile
│ │ └── docker-entrypoint.py
│ ├── graph-analytics/
│ │ └── latest/
│ │ ├── Dockerfile
│ │ ├── benchmark/
│ │ │ ├── build.sbt
│ │ │ ├── run_benchmark.sh
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── scala/
│ │ │ └── GraphAnalytics.scala
│ │ └── files/
│ │ └── entrypoint.sh
│ ├── in-memory-analytics/
│ │ └── latest/
│ │ ├── Dockerfile
│ │ ├── files/
│ │ │ ├── entrypoint.sh
│ │ │ ├── spark-defaults.conf
│ │ │ └── spark-env.sh
│ │ └── movielens-als/
│ │ ├── build.sbt
│ │ ├── run_benchmark.sh
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── MovieLensALS.scala
│ ├── media-streaming/
│ │ ├── client/
│ │ │ ├── Dockerfile
│ │ │ └── files/
│ │ │ ├── docker-entrypoint.sh
│ │ │ ├── run/
│ │ │ │ ├── benchmark.sh
│ │ │ │ ├── hostlist.client
│ │ │ │ ├── hostlist.server
│ │ │ │ ├── peak_hunter/
│ │ │ │ │ ├── launch_hunt_bin.sh
│ │ │ │ │ └── launch_remote.sh
│ │ │ │ └── process_logs.sh
│ │ │ └── videoperf/
│ │ │ ├── AUTHORS
│ │ │ ├── COPYRIGHT
│ │ │ ├── ChangeLog
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── NEWS
│ │ │ ├── README
│ │ │ ├── README.UW/
│ │ │ │ ├── README.CALL_STATS
│ │ │ │ ├── README.DYNOUT
│ │ │ │ ├── README.NO_RATE_HANG
│ │ │ │ ├── README.STABLE_STATS
│ │ │ │ ├── README.STAGGER_START
│ │ │ │ ├── README.TIMEOUT
│ │ │ │ ├── README.WSESSLOG
│ │ │ │ └── man-call_stats.txt
│ │ │ ├── README.WINDOWS
│ │ │ ├── TBB-NEW
│ │ │ ├── TODO
│ │ │ ├── aclocal.m4
│ │ │ ├── bt2line
│ │ │ ├── call.c
│ │ │ ├── call.h
│ │ │ ├── config.cache
│ │ │ ├── config.guess
│ │ │ ├── config.h
│ │ │ ├── config.h.in
│ │ │ ├── config.log
│ │ │ ├── config.status
│ │ │ ├── config.sub
│ │ │ ├── configure
│ │ │ ├── configure.in
│ │ │ ├── conn.c
│ │ │ ├── conn.h
│ │ │ ├── core.c
│ │ │ ├── core.h
│ │ │ ├── core_connect
│ │ │ ├── event.c
│ │ │ ├── event.h
│ │ │ ├── gen/
│ │ │ │ ├── Makefile
│ │ │ │ ├── Makefile.in
│ │ │ │ ├── call_seq.c
│ │ │ │ ├── conn_rate.c
│ │ │ │ ├── misc.c
│ │ │ │ ├── rate.c
│ │ │ │ ├── rate.h
│ │ │ │ ├── sess_cookie.c
│ │ │ │ ├── session.c
│ │ │ │ ├── session.h
│ │ │ │ ├── uri_fixed.c
│ │ │ │ ├── uri_wlog.c
│ │ │ │ ├── uri_wset.c
│ │ │ │ ├── videosesslog.c
│ │ │ │ ├── videosesslog.h
│ │ │ │ ├── wsess.c
│ │ │ │ └── wsesspage.c
│ │ │ ├── http.c
│ │ │ ├── http.h
│ │ │ ├── httperf.c
│ │ │ ├── httperf.h
│ │ │ ├── httperf.man
│ │ │ ├── idleconn.c
│ │ │ ├── install-sh
│ │ │ ├── lib/
│ │ │ │ ├── COPYING.txt
│ │ │ │ ├── Makefile
│ │ │ │ ├── Makefile.in
│ │ │ │ ├── README
│ │ │ │ ├── getopt.c
│ │ │ │ ├── getopt.h
│ │ │ │ ├── getopt1.c
│ │ │ │ └── ssl_writev.c
│ │ │ ├── mkinstalldirs
│ │ │ ├── notes.txt
│ │ │ ├── object.c
│ │ │ ├── object.h
│ │ │ ├── out_1080p_0.txt
│ │ │ ├── output.log
│ │ │ ├── run-httperf
│ │ │ ├── sess.c
│ │ │ ├── sess.h
│ │ │ ├── stat/
│ │ │ │ ├── Makefile
│ │ │ │ ├── Makefile.in
│ │ │ │ ├── basic.c
│ │ │ │ ├── call_stats.c
│ │ │ │ ├── call_stats.h
│ │ │ │ ├── print_reply.c
│ │ │ │ ├── sess_stat.c
│ │ │ │ ├── spec_stats.c
│ │ │ │ ├── spec_stats.h
│ │ │ │ └── stats.h
│ │ │ ├── sys_sched_affinity.c
│ │ │ ├── sys_sched_affinity.h
│ │ │ ├── tags
│ │ │ ├── timeout
│ │ │ ├── timer.c
│ │ │ ├── timer.h
│ │ │ └── ttest.c
│ │ ├── dataset/
│ │ │ ├── Dockerfile
│ │ │ ├── bootstrap.sh
│ │ │ └── files/
│ │ │ ├── download_video_files.sh
│ │ │ └── filegen/
│ │ │ ├── Makefile
│ │ │ ├── gen_fileset.c
│ │ │ ├── generate_video_files_and_logs.sh
│ │ │ ├── make_zipf.c
│ │ │ ├── params/
│ │ │ │ ├── 240p
│ │ │ │ ├── 360p
│ │ │ │ ├── 480p
│ │ │ │ └── 720p
│ │ │ └── video_gen.py
│ │ └── server/
│ │ ├── Dockerfile
│ │ ├── entrypoint.sh
│ │ └── files/
│ │ ├── HTMLWebPlayer/
│ │ │ ├── index.html
│ │ │ └── js/
│ │ │ └── helper.js
│ │ ├── limits.conf.append
│ │ └── nginx.location.append
│ ├── web-search/
│ │ ├── client/
│ │ │ ├── Dockerfile
│ │ │ ├── docker-entrypoint.py
│ │ │ └── files/
│ │ │ └── search/
│ │ │ ├── LICENSE
│ │ │ ├── build.properties
│ │ │ ├── build.xml
│ │ │ ├── config/
│ │ │ │ ├── logging.properties
│ │ │ │ └── security/
│ │ │ │ └── driver.policy
│ │ │ ├── src/
│ │ │ │ └── sample/
│ │ │ │ └── searchdriver/
│ │ │ │ ├── terms_ordered
│ │ │ │ ├── terms_original
│ │ │ │ ├── terms_random
│ │ │ │ └── terms_shuffled
│ │ │ └── template/
│ │ │ ├── Random.java.in
│ │ │ ├── Zipfian.java.in
│ │ │ ├── head.java.in
│ │ │ └── run.xml.in
│ │ ├── dataset/
│ │ │ ├── Dockerfile
│ │ │ └── docker-entrypoint.sh
│ │ ├── index/
│ │ │ ├── Dockerfile
│ │ │ ├── entrypoint.sh
│ │ │ ├── files/
│ │ │ │ ├── nutch-default.xml
│ │ │ │ ├── schema.xml
│ │ │ │ ├── seed.txt
│ │ │ │ └── solrconfig.xml
│ │ │ └── generate_index.sh
│ │ └── server/
│ │ ├── Dockerfile
│ │ ├── docker-entrypoint.sh
│ │ └── files/
│ │ ├── limits.txt
│ │ ├── query.sh
│ │ ├── schema.xml
│ │ └── solrconfig.xml
│ └── web-serving/
│ ├── db_server/
│ │ ├── Dockerfile
│ │ └── entrypoint.sh
│ ├── faban_client/
│ │ ├── Dockerfile
│ │ └── files/
│ │ ├── commons-codec-1.2.jar
│ │ ├── commons-httpclient-3.1.jar
│ │ ├── commons-logging.jar
│ │ ├── fabanagents.jar
│ │ ├── fabancommon.jar
│ │ ├── fabandriver.jar
│ │ ├── users.list
│ │ ├── usersetup.properties
│ │ └── web20_benchmark/
│ │ ├── .classpath
│ │ ├── .gitignore
│ │ ├── .metadata/
│ │ │ ├── .mylyn/
│ │ │ │ └── .taskListIndex/
│ │ │ │ ├── segments.gen
│ │ │ │ └── segments_1
│ │ │ ├── .plugins/
│ │ │ │ ├── org.eclipse.core.resources/
│ │ │ │ │ ├── .root/
│ │ │ │ │ │ └── .indexes/
│ │ │ │ │ │ ├── history.version
│ │ │ │ │ │ ├── properties.index
│ │ │ │ │ │ └── properties.version
│ │ │ │ │ └── .safetable/
│ │ │ │ │ └── org.eclipse.core.resources
│ │ │ │ ├── org.eclipse.core.runtime/
│ │ │ │ │ └── .settings/
│ │ │ │ │ ├── org.eclipse.core.resources.prefs
│ │ │ │ │ ├── org.eclipse.jdt.ui.prefs
│ │ │ │ │ ├── org.eclipse.m2e.discovery.prefs
│ │ │ │ │ ├── org.eclipse.mylyn.context.core.prefs
│ │ │ │ │ ├── org.eclipse.mylyn.monitor.ui.prefs
│ │ │ │ │ ├── org.eclipse.mylyn.tasks.ui.prefs
│ │ │ │ │ ├── org.eclipse.team.cvs.ui.prefs
│ │ │ │ │ ├── org.eclipse.team.ui.prefs
│ │ │ │ │ ├── org.eclipse.ui.ide.prefs
│ │ │ │ │ ├── org.eclipse.ui.prefs
│ │ │ │ │ └── org.eclipse.ui.workbench.prefs
│ │ │ │ ├── org.eclipse.e4.workbench/
│ │ │ │ │ └── workbench.xmi
│ │ │ │ ├── org.eclipse.jdt.core/
│ │ │ │ │ ├── assumedExternalFilesCache
│ │ │ │ │ ├── externalFilesCache
│ │ │ │ │ ├── invalidArchivesCache
│ │ │ │ │ └── nonChainingJarsCache
│ │ │ │ ├── org.eclipse.jdt.ui/
│ │ │ │ │ ├── OpenTypeHistory.xml
│ │ │ │ │ ├── QualifiedTypeNameHistory.xml
│ │ │ │ │ └── dialog_settings.xml
│ │ │ │ ├── org.eclipse.m2e.logback.configuration/
│ │ │ │ │ ├── 0.log
│ │ │ │ │ └── logback.1.5.1.20150109-1820.xml
│ │ │ │ ├── org.eclipse.ui.ide/
│ │ │ │ │ └── dialog_settings.xml
│ │ │ │ └── org.eclipse.ui.workbench/
│ │ │ │ ├── dialog_settings.xml
│ │ │ │ └── workingsets.xml
│ │ │ └── version.ini
│ │ ├── .project
│ │ ├── .settings/
│ │ │ └── org.eclipse.jdt.core.prefs
│ │ ├── build/
│ │ │ ├── Usergen.jar
│ │ │ ├── Web20Driver.jar
│ │ │ ├── classes/
│ │ │ │ ├── users.txt
│ │ │ │ └── users.xml
│ │ │ ├── commons-codec-1.2.jar
│ │ │ ├── commons-httpclient-3.1.jar
│ │ │ ├── commons-logging.jar
│ │ │ ├── fabanagents.jar
│ │ │ ├── fabancommon.jar
│ │ │ ├── fabandriver.jar
│ │ │ └── lib/
│ │ │ └── Web20Driver.jar
│ │ ├── build.properties
│ │ ├── build.xml
│ │ ├── config/
│ │ │ └── logging.properties
│ │ ├── deploy/
│ │ │ ├── benchmark.xml
│ │ │ └── run.xml
│ │ ├── lib/
│ │ │ ├── commons-codec-1.2.jar
│ │ │ ├── commons-httpclient-3.1.jar
│ │ │ ├── commons-logging.jar
│ │ │ ├── fabanagents.jar
│ │ │ ├── fabancommon.jar
│ │ │ └── fabandriver.jar
│ │ ├── run/
│ │ │ ├── entrypoint.sh
│ │ │ └── gen
│ │ ├── src/
│ │ │ ├── org/
│ │ │ │ └── json/
│ │ │ │ ├── CDL.java
│ │ │ │ ├── Cookie.java
│ │ │ │ ├── CookieList.java
│ │ │ │ ├── HTTP.java
│ │ │ │ ├── HTTPTokener.java
│ │ │ │ ├── JSONArray.java
│ │ │ │ ├── JSONException.java
│ │ │ │ ├── JSONML.java
│ │ │ │ ├── JSONObject.java
│ │ │ │ ├── JSONString.java
│ │ │ │ ├── JSONStringer.java
│ │ │ │ ├── JSONTokener.java
│ │ │ │ ├── JSONWriter.java
│ │ │ │ ├── Property.java
│ │ │ │ ├── README
│ │ │ │ ├── XML.java
│ │ │ │ └── XMLTokener.java
│ │ │ ├── setup/
│ │ │ │ └── UserGenerator.java
│ │ │ ├── users.txt
│ │ │ ├── users.xml
│ │ │ ├── usersetup.properties
│ │ │ └── workload/
│ │ │ ├── driver/
│ │ │ │ ├── RandomStringGenerator.java
│ │ │ │ ├── UserPasswordPair.java
│ │ │ │ ├── Web20Client.java
│ │ │ │ ├── Web20Driver.java
│ │ │ │ └── Web20Driver.java.in
│ │ │ └── harness/
│ │ │ └── ElggBenchmark.java
│ │ └── users.list
│ ├── memcached_server/
│ │ └── Dockerfile
│ └── web_server/
│ ├── Dockerfile
│ ├── bootstrap.sh
│ └── files/
│ ├── limits.conf.append
│ ├── nginx_sites_avail_pt.append
│ ├── nginx_sites_avail_tls.append
│ ├── repos.append
│ └── settings_4.3.php
├── commons/
│ ├── base-os/
│ │ ├── Dockerfile.amd64
│ │ ├── Dockerfile.arm64
│ │ ├── Dockerfile.riscv64
│ │ └── build.sh
│ ├── cassandra/
│ │ ├── 3.11.6/
│ │ │ ├── Dockerfile
│ │ │ └── jvm.options
│ │ └── 4.1.0/
│ │ ├── Dockerfile
│ │ └── install.sh
│ ├── faban/
│ │ └── 1.4/
│ │ └── Dockerfile
│ ├── hadoop/
│ │ ├── 2.10.2/
│ │ │ ├── Dockerfile
│ │ │ └── files/
│ │ │ ├── core-site.xml.template
│ │ │ ├── entrypoint.sh
│ │ │ ├── example_benchmark.sh
│ │ │ ├── hadoop-start.py
│ │ │ ├── hdfs-site.xml.template
│ │ │ ├── mapred-site.xml.template
│ │ │ └── yarn-site.xml.template
│ │ └── 3.3.4/
│ │ ├── Dockerfile
│ │ └── files/
│ │ ├── core-site.xml.template
│ │ ├── hadoop-start.py
│ │ ├── hdfs-site.xml.template
│ │ ├── mapred-site.xml.template
│ │ └── yarn-site.xml.template
│ ├── java/
│ │ ├── openjdk11/
│ │ │ └── Dockerfile
│ │ └── openjdk17/
│ │ └── Dockerfile
│ ├── memcached/
│ │ ├── 1.6.10/
│ │ │ └── Dockerfile
│ │ └── 1.6.15/
│ │ └── Dockerfile
│ ├── mysql/
│ │ └── mariadb-10.6/
│ │ ├── Dockerfile
│ │ ├── bootstrap.sh
│ │ └── files/
│ │ └── execute.sh
│ ├── postgresql/
│ │ └── 15/
│ │ └── Dockerfile
│ └── spark/
│ ├── 2.4.5/
│ │ ├── Dockerfile
│ │ └── files/
│ │ ├── entrypoint.sh
│ │ ├── start-master-fg.sh
│ │ └── start-worker-fg.sh
│ └── 3.3.2/
│ ├── Dockerfile
│ └── files/
│ ├── entrypoint.sh
│ ├── start-master-fg.sh
│ └── start-worker-fg.sh
├── datasets/
│ ├── movielens-dataset/
│ │ └── latest/
│ │ ├── .gitignore
│ │ ├── Dockerfile
│ │ └── files/
│ │ └── myratings.csv
│ ├── twitter-dataset-graph/
│ │ └── latest/
│ │ └── Dockerfile
│ └── wikimedia-pages-dataset/
│ └── latest/
│ └── Dockerfile
└── docs/
├── benchmarks/
│ ├── data-analytics.md
│ ├── data-caching.md
│ ├── data-serving-relational.md
│ ├── data-serving.md
│ ├── graph-analytics.md
│ ├── in-memory-analytics.md
│ ├── media-streaming.md
│ ├── web-search.md
│ └── web-serving.md
├── buildx.md
└── datasets/
└── movielens-dataset.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/scripts/build-images.sh
================================================
#!/bin/bash
# @authors: Somya Arora, Arash Pourhabibi
# @modified: Shanqing Lin, Ali Ansari
# 1. Figure out the modified files
if [ "${GITHUB_EVENT_NAME}" = "pull_request" ]; then
modified_files=$(git --no-pager diff --name-only ${PR_COMMIT_RANGE})
else
modified_files=$(git --no-pager diff --name-only ${PUSH_COMMIT_RANGE})
fi
# 2.Get benchmark name and tag name for this build
image_name=${DH_REPO#*/}
tag_name=$IMG_TAG
if [ -z "$modified_files" ]; then
echo "No Modifications required."
else
echo "Checking against modified files"
fi
# 3.Find out whether the files related with the current build were modified or not
if (grep -q "${DF_PATH#./}" <<<$modified_files) || # Rebuild the image if any file in the build folder is changed
(grep -q "build-images.sh" <<<$modified_files) ||
(grep -q "build-images.yaml" <<<$modified_files) ||
[ "${IS_PARENT_MODIFIED}" = "true" ]; then
# if modified, then rebuild their docker image
# remove build cache
docker buildx prune -a -f
# install QEMU for extra arch
arch_list=${DBX_PLATFORM//linux\//} # linux/amd64,linux/arm64,linux/riscv64 -> amd64,arm64,riscv64
echo "Platforms: ${arch_list}"
extra_arch_list=${arch_list#amd64} # amd64,arm64,riscv64 -> ,arm64,riscv64
extra_arch_list=${extra_arch_list#,}
# reference: https://github.com/tonistiigi/binfmt/
if [ $extra_arch_list ]; then
docker run --rm --privileged 'tonistiigi/binfmt:latest' --install $extra_arch_list
# reference: https://github.com/docker/buildx/issues/495
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker buildx create --name multiarch --driver docker-container --use
docker buildx inspect --bootstrap
else
echo "No extra arch is found, skipping install QEMU."
fi
if ( [ "${GITHUB_EVENT_NAME}" = "push" ] && [ "${GITHUB_REF}" = "refs/heads/main" ] ) || [ "${FORCE_PUSH}" = "true" ]; then
docker login -u="$DOCKER_USER" -p="$DOCKER_PASS"
# Pushing needs login, test if login was successful
if [ $? != "0" ]; then
exit 1
fi
DO_PUSH="--push"
fi
if ([ $image_name = "base-os" ]); then
cd $DF_PATH
for arch in amd64 arm64 riscv64; do
docker buildx build --platform=linux/${arch} -t $DH_REPO:${arch} -f Dockerfile.${arch} $DO_PUSH .
if [ $? != "0" ]; then
exit 1
fi
if [ -n "$DO_PUSH" ]; then
docker buildx imagetools create -t $DH_REPO:$IMG_TAG $DH_REPO:amd64 $DH_REPO:arm64 $DH_REPO:riscv64
fi
done
else
docker buildx build --platform $DBX_PLATFORM -t $DH_REPO:$IMG_TAG $DO_PUSH $DF_PATH
fi
# make sure build was successful
if [ $? != "0" ]; then
exit 1
fi
echo "MODIFIED=true" >> $GITHUB_ENV
# if no file related to this image was modified
else
echo "No Modifications to this image"
fi
================================================
FILE: .github/workflows/build-images.yaml
================================================
name: build-and-push-docker-image
on:
push:
branches:
- main
- dev
pull_request:
branches:
- main
- dev
env:
PUSH_COMMIT_RANGE: ${{ github.event.before }}...${{ github.event.after }}
PR_COMMIT_RANGE: ${{ github.event.pull_request.base.sha }}...${{ github.event.pull_request.head.sha }}
DOCKER_USER: ${{ secrets.DOCKER_HUB_USERNAME }}
DOCKER_PASS: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
FORCE_PUSH: "false"
jobs:
base-os:
runs-on: ubuntu-latest
env:
DH_REPO: "cloudsuite/${{ github.job }}"
DF_PATH: "./commons/base-os"
DBX_PLATFORM: "linux/amd64,linux/arm64,linux/riscv64"
outputs:
is_parent_modified: ${{ steps.set_is_parent_modified.outputs.is_parent_modified }}
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "ubuntu"
- id: set_is_parent_modified
run: echo "is_parent_modified=${MODIFIED}" >> $GITHUB_OUTPUT
java:
runs-on: ubuntu-latest
needs: base-os
env:
DH_REPO: "cloudsuite/${{ github.job }}"
outputs:
is_parent_modified: ${{ steps.set_is_parent_modified.outputs.is_parent_modified }}
strategy:
matrix:
include:
- tag: "openjdk11"
platform: "linux/amd64,linux/arm64,linux/riscv64"
- tag: "openjdk17"
platform: "linux/amd64,linux/arm64,linux/riscv64"
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.base-os.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./commons/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
- id: set_is_parent_modified
run: echo "is_parent_modified=${MODIFIED}" >> $GITHUB_OUTPUT
mysql:
runs-on: ubuntu-latest
needs: base-os
env:
DH_REPO: "cloudsuite/${{ github.job }}"
outputs:
is_parent_modified: ${{ steps.set_is_parent_modified.outputs.is_parent_modified }}
strategy:
matrix:
tag: ["mariadb-10.6"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.base-os.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./commons/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
- id: set_is_parent_modified
run: echo "is_parent_modified=${MODIFIED}" >> $GITHUB_OUTPUT
memcached:
runs-on: ubuntu-latest
needs: base-os
env:
DH_REPO: "cloudsuite/${{ github.job }}"
outputs:
is_parent_modified: ${{ steps.set_is_parent_modified.outputs.is_parent_modified }}
strategy:
matrix:
tag: ["1.6.15"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.base-os.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./commons/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
- id: set_is_parent_modified
run: echo "is_parent_modified=${MODIFIED}" >> $GITHUB_OUTPUT
faban:
runs-on: ubuntu-latest
needs: java
env:
DH_REPO: "cloudsuite/${{ github.job }}"
outputs:
is_parent_modified: ${{ steps.set_is_parent_modified.outputs.is_parent_modified }}
strategy:
matrix:
tag: ["1.4"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.java.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./commons/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
- id: set_is_parent_modified
run: echo "is_parent_modified=${MODIFIED}" >> $GITHUB_OUTPUT
spark:
runs-on: ubuntu-latest
needs: java
env:
DH_REPO: "cloudsuite/${{ github.job }}"
outputs:
is_parent_modified: ${{ steps.set_is_parent_modified.outputs.is_parent_modified }}
strategy:
matrix:
tag: ["3.3.2"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.java.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./commons/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
- id: set_is_parent_modified
run: echo "is_parent_modified=${MODIFIED}" >> $GITHUB_OUTPUT
cassandra:
runs-on: ubuntu-latest
needs: java
env:
DH_REPO: "cloudsuite/${{ github.job }}"
outputs:
is_parent_modified: ${{ steps.set_is_parent_modified.outputs.is_parent_modified }}
strategy:
matrix:
tag: ["3.11.6"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.java.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./commons/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
- id: set_is_parent_modified
run: echo "is_parent_modified=${MODIFIED}" >> $GITHUB_OUTPUT
hadoop:
runs-on: ubuntu-latest
needs: java
env:
DH_REPO: "cloudsuite/${{ github.job }}"
outputs:
is_parent_modified: ${{ steps.set_is_parent_modified.outputs.is_parent_modified }}
strategy:
matrix:
tag: ["2.10.2", "3.3.4"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.java.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./commons/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
- id: set_is_parent_modified
run: echo "is_parent_modified=${MODIFIED}" >> $GITHUB_OUTPUT
postgresql:
runs-on: ubuntu-latest
needs: base-os
env:
DH_REPO: "cloudsuite/${{ github.job }}"
outputs:
is_parent_modified: ${{ steps.set_is_parent_modified.outputs.is_parent_modified }}
strategy:
matrix:
tag: ["15"]
platform: ["linux/amd64,linux/arm64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.java.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./commons/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
- id: set_is_parent_modified
run: echo "is_parent_modified=${MODIFIED}" >> $GITHUB_OUTPUT
data-analytics:
runs-on: ubuntu-latest
needs: hadoop
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
tag: ["latest"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.hadoop.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./benchmarks/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
data-caching:
runs-on: ubuntu-latest
needs: memcached
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
include:
- tag: "server"
platform: "linux/amd64,linux/arm64,linux/riscv64"
- tag: "client"
platform: "linux/amd64,linux/arm64,linux/riscv64"
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.memcached.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./benchmarks/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
data-serving:
runs-on: ubuntu-latest
needs: cassandra
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
tag: ["server", "client"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.cassandra.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./benchmarks/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
data-serving-relational:
runs-on: ubuntu-latest
needs: postgresql
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
tag: ["server", "client"]
platform: ["linux/amd64,linux/arm64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.cassandra.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./benchmarks/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
graph-analytics:
runs-on: ubuntu-latest
needs: spark
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
tag: ["latest"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.spark.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./benchmarks/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
in-memory-analytics:
runs-on: ubuntu-latest
needs: spark
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
tag: ["latest"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.spark.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./benchmarks/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
media-streaming:
runs-on: ubuntu-latest
needs: base-os
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
tag: ["client", "server", "dataset"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.base-os.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./benchmarks/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
web-search:
runs-on: ubuntu-latest
needs: faban
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
tag: ["client", "server", "dataset"]
platform: ["linux/amd64,linux/arm64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.faban.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./benchmarks/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
web-serving:
runs-on: ubuntu-latest
needs: [faban, mysql, memcached]
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
tag: ["db_server", "faban_client", "memcached_server", "web_server"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.faban.outputs.is_parent_modified == 'true' ||
needs.mysql.outputs.is_parent_modified == 'true' ||
needs.memcached.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./benchmarks/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
movielens-dataset:
runs-on: ubuntu-latest
needs: base-os
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
tag: ["latest"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.base-os.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./datasets/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
twitter-dataset-graph:
runs-on: ubuntu-latest
needs: base-os
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
tag: ["latest"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.base-os.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./datasets/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
wikimedia-pages-dataset:
runs-on: ubuntu-latest
needs: base-os
env:
DH_REPO: "cloudsuite/${{ github.job }}"
strategy:
matrix:
tag: ["latest"]
platform: ["linux/amd64,linux/arm64,linux/riscv64"]
steps:
- name: checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- if: ${{ needs.base-os.outputs.is_parent_modified == 'true' }}
run: echo "IS_PARENT_MODIFIED=true" >> $GITHUB_ENV
- name: build and push
run: "./.github/scripts/build-images.sh"
env:
IMG_TAG: "${{ matrix.tag }}"
DF_PATH: "./datasets/${{ github.job }}/${{ matrix.tag }}"
DBX_PLATFORM: ${{ matrix.platform }}
================================================
FILE: .github/workflows/spell-check.yaml
================================================
on:
push:
branches:
- main
- dev
pull_request:
branches:
- main
- dev
jobs:
spell-check:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: spell-check
uses: rojopolis/spellcheck-github-actions@0.29.0
================================================
FILE: .gitignore
================================================
.DS_Store
================================================
FILE: .spellcheck.yml
================================================
matrix:
- name: md source
aspell:
lang: en
d: en_US
ignore-case: true
mode: html
default_encoding: utf-8
dictionary:
wordlists:
- "./.wordlist.txt"
pipeline:
- pyspelling.filters.markdown:
- pyspelling.filters.html:
comments: false
ignores: [code, pre, href]
- pyspelling.filters.text:
sources:
- docs/*.md
- docs/**/*.md
================================================
FILE: .wordlist.txt
================================================
ALS
analytical
analytics
backend
balancer
basedocker
benchmarked
benchmarking
BuildKit
buildkitd
buildx
cassandra
cd
CLI
clientdocker
cloudsuite
CloudSuite
Cloudsuite's
cmd
conf
cpufreq
cpus
cpuset
csv
datacenters
dataset
datasets
dhpulls
dhrepo
dhstars
dns
Dockerfile
Dockerfiles
dockerhub
DockerHub
dP
dt
Elgg
entrypoint
epfl
ethernet
faban
FastCGI
fb
filesystem
fpm
frontend
Gbit
GBs
GC
github
GraphX
grouplens
hadoop
HDFS
HHVM
HipHop
hostname
hostnames
httperf
https
IP
IPAddress
JVM
JIT
keyspace
LLC
localhost
login
MapReduce
masterdocker
Mbps
md
Mediawiki
memcache
memcached
MemcacheServer
memcacheserverdocker
metadata
middleware
microarchitectures
MLlib
Moby
Movielens
Multisocket
multuarch
myratings
MySQL
MysqlServer
mysqlserverdocker
mysqlserverdocker
nginx
NoSQL
Nutch
OLTP
OPERATIONCOUNT
os
PageRank
parallelize
parallelized
parsa
php
PHP
pingable
pregenerated
qemu
QEMU
QoS
README
realtime
Recommender
RECORDCOUNT
repo
runtime
scalability
Skylake
slavedocker
solr
solr's
SQL
src
stddev
sudo
sys
sysbench
taskset
TCP
TPC
tpcc
threadcount
txt
UI
usertable
usr
uwsgi
vectorization
videoperf
VM
VMs
warmup
WebServer
webserverdocker
webserverdocker
Wikimedia
yaml
YCSB
pre
latencies
TLS
Elgg's
================================================
FILE: LICENSE.md
================================================
CloudSuite consists of several software components that are governed by various licensing terms, in addition to software that was developed internally. Anyone interested in using CloudSuite needs to fully understand and abide by the licenses governing all the software components.
### Software developed externally (not by the CloudSuite group)
* [Nginx Web Server](http://nginx.org/LICENSE)
* [PHP](http://www.php.net/license/3_01.txt)
* [APC (Alternative PHP Cache)](http://www.php.net/license/3_01.txt)
* [Nutch](http://www.apache.org/licenses/LICENSE-2.0)
* [Hadoop](http://www.apache.org/licenses/LICENSE-2.0)
* [Mahout](http://www.apache.org/licenses/LICENSE-2.0)
* [Cassandra](http://www.apache.org/licenses/LICENSE-2.0)
* [Yahoo! Cloud Serving Benchmark Framework](https://github.com/brianfrankcooper/YCSB/blob/master/LICENSE.txt)
* [Faban workload generator](http://www.opensource.org/licenses/cddl1.php)
* [Memcached](https://github.com/memcached/memcached/blob/master/LICENSE)
* [Httperf](https://github.com/httperf/httperf/blob/master/COPYRIGHT)
* [Spark](https://github.com/apache/spark/blob/master/LICENSE)
* [MLlib](https://github.com/apache/spark/blob/master/LICENSE)
* [GraphX](https://github.com/apache/spark/blob/master/LICENSE)
* [Sorl](http://www.apache.org/licenses/LICENSE-2.0)
* [Zookeeper](http://www.apache.org/licenses/LICENSE-2.0)
* [Lucene](http://www.apache.org/licenses/LICENSE-2.0)
* [Ant](http://www.apache.org/licenses/LICENSE-2.0)
* [Elgg](https://www.gnu.org/licenses/gpl-2.0.html)
### Software developed internally (by the CloudSuite group)
**CloudSuite 4.0 License**
CloudSuite 4.0 Benchmark Suite
Copyright © 2011-2023, Parallel Systems Architecture Lab, EPFL
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name of the Parallel Systems Architecture Laboratory, EPFL, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PARALLEL SYSTEMS ARCHITECTURE LABORATORY, EPFL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: README.md
================================================
# CloudSuite 4.0 #
**This branch contains the release of CloudSuite v4.0. If you are looking for CloudSuite 3, please checkout the [CSv3][CSv3] branch.**
[CloudSuite][csp] is a benchmark suite for cloud services. The fourth release consists of eight first-party applications that have been selected based on their popularity in today's datacenters. The benchmarks are based on real-world software stacks and represent real-world setups.
CloudSuite 4.0 includes a thorough software stack update and bug fixes for all workloads. It also includes support for all workloads on ARM to follow the rising trend of the ARM server market. It also features detailed guidelines for tuning and running the workloads in representative states, facilitating ease of use.
# How to Run #
For more details on how to run the workloads, please follow each workload's documentation:
- [Data Analytics](docs/benchmarks/data-analytics.md)
- [Data Caching](docs/benchmarks/data-caching.md)
- [Data Serving](docs/benchmarks/data-serving.md)
- [Graph Analytics](docs/benchmarks/graph-analytics.md)
- [In-memory Analytics](docs/benchmarks/in-memory-analytics.md)
- [Media Streaming](docs/benchmarks/media-streaming.md)
- [Web Search](docs/benchmarks/web-search.md)
- [Web Serving](docs/benchmarks/web-serving.md)
To ease the deployment of CloudSuite into private and public cloud systems, we provide docker images for all CloudSuite benchmarks
(available [here][csb]).
# Workload Status #
To see which workloads are currently functioning on the new architectures, you can find the status matrix [here][status_pg].
# Licensing #
CloudSuite's software components are all available as open-source software. All of the software components are governed by
their own licensing terms. Researchers interested in using CloudSuite are required to fully understand and abide by the
licensing terms of the various components. For more information, please refer to the [license page][csl].
# Support #
We encourage CloudSuite users to use GitHub issues to request for enhancements, questions or bug fixes.
[csp]: http://cloudsuite.ch "CloudSuite Page"
[csl]: http://cloudsuite.ch/pages/license/ "CloudSuite License"
[csb]: http://cloudsuite.ch/#download "CloudSuite Benchmarks"
[CSv3]: https://github.com/parsa-epfl/cloudsuite/tree/CSv3 "CloudSuite v3"
[status_pg]: https://github.com/parsa-epfl/cloudsuite/wiki/CloudSuite-4.0-Workload-Status-Matrix
================================================
FILE: benchmarks/data-analytics/latest/Dockerfile
================================================
FROM cloudsuite/hadoop:2.10.2
ENV MAHOUT_VERSION 14.1
ENV MAHOUT_HOME /opt/mahout-${MAHOUT_VERSION}
RUN mkdir ${MAHOUT_HOME} /user
# Install Mahout
RUN set -x \
&& URL=https://downloads.apache.org/mahout/${MAHOUT_VERSION}/apache-mahout-distribution-${MAHOUT_VERSION}.tar.gz \
&& curl ${URL} | tar -xzC ${MAHOUT_HOME}
COPY files/benchmark.sh /root/
COPY files/docker-entrypoint.py /root/
COPY files/mahout-examples-0.13.0-job.jar ${MAHOUT_HOME}/.
COPY files/categories /user/
RUN chmod +x /root/benchmark.sh /root/docker-entrypoint.py \
&& ln -s /root/benchmark.sh /bin/benchmark
ENTRYPOINT ["/root/docker-entrypoint.py"]
================================================
FILE: benchmarks/data-analytics/latest/files/benchmark.sh
================================================
#!/bin/bash
RED='\033[0;31m'
RESET='\033[0m'
source ~/.bashrc
echo -e "Mahout: Start HDFS server"
${HADOOP_HOME}/bin/hdfs dfs -test -e /data/wiki
if [ $? -ne 0 ]; then
echo -e "Mahout: make dir for /user/data/wiki"
${HADOOP_HOME}/bin/hdfs dfs -mkdir -p /user/data
${HADOOP_HOME}/bin/hdfs dfs -put /data/wiki /user/data/
fi
START=$(($(date +"%s%N")/1000000))
# Create sequence files from wiki
echo -e "${RED}Mahout: seqwiki${RESET}"
${MAHOUT_HOME}/bin/mahout seqwiki -c /user/categories -i /user/data/wiki -o /user/data/wiki-seq
# Convert sequence files to vectors using bigrams
echo -e "${RED}Mahout: seq2sparse${RESET}"
${MAHOUT_HOME}/bin/mahout seq2sparse -i /user/data/wiki-seq -o /user/data/wiki-vectors -lnorm -nv -wt tfidf -ow -ng 2
# Create training and holdout sets with a random 80-20 split of the generated vector dataset
echo -e "${RED}Mahout: split${RESET}"
${MAHOUT_HOME}/bin/mahout split -i /user/data/wiki-vectors/tfidf-vectors --trainingOutput /user/data/training \
--testOutput /user/data/testing -rp 20 -ow -seq -xm sequential
# Train Bayes model
echo -e "${RED}Mahout: trainnb${RESET}"
${MAHOUT_HOME}/bin/mahout trainnb -i /user/data/training -o /user/data/model -li /user/data/labelindex -ow -c
# Test on holdout set
echo -e "${RED}Mahout: testnb${RESET}"
${MAHOUT_HOME}/bin/mahout testnb -i /user/data/testing -m /user/data/model -l /user/data/labelindex -ow -o /user/data/output -seq
END=$(($(date +"%s%N")/1000000))
TIME=$(($END - $START))
echo -e "\nBenchmark time: ${TIME}ms"
================================================
FILE: benchmarks/data-analytics/latest/files/categories
================================================
Art
Culture
Economics
Education
Event
Health
History
Industry
Sports
Geography
Cities
Countries
Language
Law
Media
Nature
People
Philosophy
Politics
Regions
Religion
Science
Society
Technology
Transport
================================================
FILE: benchmarks/data-analytics/latest/files/docker-entrypoint.py
================================================
#!/usr/bin/env python3
import os
import sys
import subprocess
import argparse
args = sys.argv[1:]
parser = argparse.ArgumentParser()
parser.add_argument("--yarn-cores", help="YARN: number of cores for yarn", default=8)
parser.add_argument("--mapreduce-mem", help="MAP_REDUCE: memory per mapreduce worker", default=2096)
args_parsed, unknown = parser.parse_known_args()
yarn_max_mem = int(args_parsed.mapreduce_mem) * int(args_parsed.yarn_cores)
args.append("--yarn-mem=" + str(yarn_max_mem + 812))
print(str(args))
subprocess.call(['./hadoop-start.py'] + args)
================================================
FILE: benchmarks/data-analytics/latest/files/mahout-examples-0.13.0-job.jar
================================================
[File too large to display: 76.8 MB]
================================================
FILE: benchmarks/data-caching/client/Dockerfile
================================================
FROM cloudsuite/base-os:ubuntu
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added
RUN groupadd -r memcache && useradd -r -g memcache memcache
ENV DEBIAN_FRONTEND noninteractive
RUN buildDeps='curl gcc libc6-dev make' \
&& set -x \
&& apt-get update && apt-get install -y $buildDeps libevent-dev vim --no-install-recommends \
&& rm -rf /var/lib/apt/lists/* \
&& curl -k -L --remote-name http://github.com/parsa-epfl/memcached-loadtester/archive/refs/tags/v4.0.tar.gz \
&& mkdir -p /usr/src/memcached \
&& tar xvf v4.0.tar.gz -C /usr/src/memcached --strip-components=1 \
&& rm v4.0.tar.gz \
&& cd /usr/src/memcached/memcached_client \
&& make -j $(nproc) \
&& chown -R memcache:memcache /usr/src/memcached \
&& apt-get purge -y --auto-remove $buildDeps
COPY docker-entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
USER memcache
CMD ["/bin/bash"]
================================================
FILE: benchmarks/data-caching/client/docker-entrypoint.sh
================================================
#!/bin/bash
ARGS=()
MODE="bash"
SCALE=30
WORKERS=4
SERVER_MEMORY=4096
INTERVAL=1
GET_RATIO=0.8
CONNECTION=200
RPS=10000
NEGATIVE_EXPONENTIAL=false
while (( ${#@} )); do
case ${1} in
--m=*) MODE=${1#*=} ;;
--S=*) SCALE=${1#*=} ;;
--w=*) WORKERS=${1#*=} ;;
--D=*) SERVER_MEMORY=${1#*=} ;;
--T=*) INTERVAL=${1#*=} ;;
--g=*) GET_RATIO=${1#*=} ;;
--c=*) CONNECTION=${1#*=} ;;
--r=*) RPS=${1#*=} ;;
--ne) NEGATIVE_EXPONENTIAL=true ;;
*) ARGS+=(${1}) ;;
esac
shift
done
set -- ${ARGS[@]}
if [ "$MODE" = 'S&W' ]; then
echo "scale and warmup"
/usr/src/memcached/memcached_client/loader \
-a /usr/src/memcached/twitter_dataset/twitter_dataset_unscaled \
-o /usr/src/memcached/twitter_dataset/twitter_dataset_${SCALE}x \
-s /usr/src/memcached/memcached_client/docker_servers/docker_servers.txt \
-w ${WORKERS} -S ${SCALE} -D ${SERVER_MEMORY} -j -T ${INTERVAL}
elif [ "$MODE" = 'W' ]; then
echo "warmup"
/usr/src/memcached/memcached_client/loader \
-a /usr/src/memcached/twitter_dataset/twitter_dataset_${SCALE}x \
-s /usr/src/memcached/memcached_client/docker_servers/docker_servers.txt \
-w ${WORKERS} -S 1 -D ${SERVER_MEMORY} -j -T ${INTERVAL}
elif [ "$MODE" = 'TH' ]; then
echo "max throughput"
/usr/src/memcached/memcached_client/loader \
-a /usr/src/memcached/twitter_dataset/twitter_dataset_${SCALE}x \
-s /usr/src/memcached/memcached_client/docker_servers/docker_servers.txt \
-g ${GET_RATIO} -w ${WORKERS} -c ${CONNECTION} -T ${INTERVAL}
elif [ "$MODE" = 'RPS' ]; then
echo "RPS"
if [ "$NEGATIVE_EXPONENTIAL" = true ]; then
ADDITIONA_OPTION="-e"
fi
/usr/src/memcached/memcached_client/loader \
-a /usr/src/memcached/twitter_dataset/twitter_dataset_${SCALE}x \
-s /usr/src/memcached/memcached_client/docker_servers/docker_servers.txt \
-g ${GET_RATIO} -w ${WORKERS} -c ${CONNECTION} -T ${INTERVAL} $ADDITIONA_OPTION -r ${RPS}
elif [ "$MODE" = "bash" ]; then
# bash
exec /bin/bash
fi
================================================
FILE: benchmarks/data-caching/server/Dockerfile
================================================
FROM cloudsuite/memcached:1.6.15
# the entry point is set to memcached in the base image
CMD ["-t", "2", "-m", "2048", "-n", "550"]
================================================
FILE: benchmarks/data-serving/.gitignore
================================================
*~
================================================
FILE: benchmarks/data-serving/client/Dockerfile
================================================
FROM cloudsuite/cassandra:4.1.0
ENV YCSB_VERSION 0.17.0
RUN wget -q --show-progress --progress=bar:force https://github.com/brianfrankcooper/YCSB/releases/download/$YCSB_VERSION/ycsb-$YCSB_VERSION.tar.gz -O /ycsb-$YCSB_VERSION.tar.gz \
&& tar -xzf /ycsb-$YCSB_VERSION.tar.gz && rm /ycsb-$YCSB_VERSION.tar.gz && mv /ycsb-$YCSB_VERSION /ycsb
COPY setup_tables.txt /setup_tables.txt
COPY warmup.sh /warmup.sh
COPY load.sh /load.sh
RUN chmod +x /load.sh /warmup.sh
================================================
FILE: benchmarks/data-serving/client/load.sh
================================================
#!/bin/bash
# Usage: load.sh <server_ip> <record_count> <target_load> <threads=1> <operation_count=load * 60>
if [ $# -le 2 ]; then
echo "usage: load.sh <server_ip> <record_count> <target_load> <threads=1> <operation_count=load * 60>"
exit 0
fi
if [ -z $4 ]; then
THREADS=1
else
THREADS=$4
fi
if [ -z $5 ]; then
let OP_COUNT="60*$3"
else
OP_COUNT=$5
fi
echo '======================================================'
echo "server IP: $1"
echo "Database record count: $2"
echo "Target load: $3 rps"
echo "Loader threads count: $THREADS"
echo "Opeartion count: $OP_COUNT"
echo "Make sure you have run the warmup.sh before loading the server, and use the same record count here."
echo '======================================================'
/ycsb/bin/ycsb.sh run cassandra-cql -p hosts=$1 -P /ycsb/workloads/workloada \
-p recordcount=$2 -p operationcount=$OP_COUNT \
-threads $THREADS -target $3 -s
================================================
FILE: benchmarks/data-serving/client/setup_tables.txt
================================================
create keyspace if not exists ycsb
WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor': 3 };
use ycsb;
create table if not exists usertable (
y_id varchar primary key,
field0 varchar,
field1 varchar,
field2 varchar,
field3 varchar,
field4 varchar,
field5 varchar,
field6 varchar,
field7 varchar,
field8 varchar,
field9 varchar);
exit;
================================================
FILE: benchmarks/data-serving/client/warmup.sh
================================================
#!/bin/bash
# This script helps to fill the server database with given data set size.
# Usage: warmup.sh <server_ip> <record_count> <threads=1>
# Each record takes 1KB to store, so if you want a 10GB database, just giving 10M records.
if [ $# -le 1 ]; then
echo "usage: warm.sh <server_ip> <record_count> <threads=1>"
exit 0
fi
if [ -z $3 ]; then
THREADS=1
else
THREADS=$3
fi
echo '======================================================'
echo "server IP: $1"
echo "Fill the database with $2 records"
echo "Load generator threads count: $THREADS"
echo '======================================================'
echo '======================================================'
echo 'Creating a usertable for the seed server'
echo '======================================================'
first_server=$(cut -d',' -f1 <<< "$1")
exit=0
while [ $exit -eq 0 ]; do
set +e
cqlsh -f /setup_tables.txt $first_server
if [[ "$?" -eq 0 ]]; then
exit=1
else
echo 'Cannot connect to the seed server. Trying again...'
fi
set -e
sleep 5
done
echo '======================================================'
echo 'Populate the database'
echo '======================================================'
/ycsb/bin/ycsb.sh load cassandra-cql -p hosts=$1 -P /ycsb/workloads/workloada -p recordcount=$2 -s -threads $THREADS
echo '======================================================'
echo 'Warm up is done.'
echo '======================================================'
================================================
FILE: benchmarks/data-serving/server/Dockerfile
================================================
FROM cloudsuite/cassandra:4.1.0
RUN apt update && apt install -y --no-install-recommends python3-yaml && rm -rf /var/lib/apt/lists/*
COPY docker-entrypoint.py /
ENTRYPOINT ["/docker-entrypoint.py"]
EXPOSE 7000 7001 7199 9042 9160
================================================
FILE: benchmarks/data-serving/server/README.md
================================================
# Cassandra Server #
## Single Node
Check the configuration parameters: conf/cassandra.yaml contains default values for the Cassandra parameters. First, ensure that the paths for the following parameters point to the directories where you have write permission.
```
data_file_directories, commitlog_directory, and saved_caches_directory
```
Run the test command listed below, if there are no errors, then your installation was likely successful.
```
cassandra -f
```
## Multi Node
You need to configure each Cassandra instance properly to communicate with each other. The way that a Cassandra node is designed to communicate with other nodes is through the Gossip protocol. Each Cassandra node should know at least one reliable Cassandra node called the seed. You can find more details at this website: http://wiki.apache.org/cassandra/GettingStarted.
i. Configure the seed for each node in the conf/cassandra.yaml file.
ii. Configure the listen_address and rpc_address in conf/cassandra.yaml to the hostname (or IP of the node).
================================================
FILE: benchmarks/data-serving/server/docker-entrypoint.py
================================================
#!/usr/bin/env python3
import socket
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(0)
try:
# doesn't even have to be reachable
s.connect(('8.8.8.8', 1))
IP = s.getsockname()[0]
except Exception:
IP = '127.0.0.1'
finally:
s.close()
return IP
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--listen-ip", "-a", help="The listening IP address of Cassandra. If no value provided, the script tries to find the primary IP address by itself.", default=get_ip())
parser.add_argument("--reader-count", "-r", type=int, help="The number of reader threads. Recommended value: 16 per disk to store data. Default is 16", default=16)
parser.add_argument("--writer-count", "-w", type=int, help="The number of writer threads. Recommended value: 8 per CPU core. Default is 32.", default=32)
parser.add_argument("--heap-size", type=int, help="The size of JVM heap in GB. Default is max(min(1/2 ram, 1GB), min(1/4 ram, 8GB)).")
parser.add_argument("--seed-server-ip", help="The IP address of the seed server. This option is only for multiple-node deployment.")
parser.add_argument("--affinity", help="The CPU ids (separated by comma) given to Cassandra to set JVM affinity. By default, Cassandra would use all CPU cores.")
args = parser.parse_args()
import yaml
import os
import os.path as path
import shutil
CASSANDRA_CONFIG = os.environ["CASSANDRA_CONFIG"]
# Backup the original file
if not path.exists(f"{CASSANDRA_CONFIG}/cassandra.yaml.bak"):
shutil.copy(f"{CASSANDRA_CONFIG}/cassandra.yaml", f"{CASSANDRA_CONFIG}/cassandra.yaml.bak")
if not path.exists(f"{CASSANDRA_CONFIG}/jvm-server.options.bak"):
shutil.copy(f"{CASSANDRA_CONFIG}/jvm-server.options", f"{CASSANDRA_CONFIG}/jvm-server.options.bak")
# Now, modify the cassandra.yaml
with open(f"{CASSANDRA_CONFIG}/cassandra.yaml") as f:
config = yaml.safe_load(f)
# Update some terms accordingly.
config["rpc_address"] = "0.0.0.0"
config["listen_address"] = args.listen_ip
config["broadcast_address"] = args.listen_ip
config["broadcast_rpc_address"] = args.listen_ip
config["seed_provider"][0]["parameters"][0]["seeds"] = f"{args.listen_ip}:7000"
config["concurrent_reads"] = args.reader_count
config["concurrent_counter_writes"] = args.reader_count
config["concurrent_writes"] = args.writer_count
if args.seed_server_ip:
config["seed_provider"][0]["parameters"][0]["seeds"] = f"{args.seed_server_ip}:7000"
print(f"A regular server is listened on {args.listen_ip} and will search for seed at {args.seed_server_ip}.")
else:
print(f"A seed server is listened on {args.listen_ip}")
# Dump the file
with open(f"{CASSANDRA_CONFIG}/cassandra.yaml", "w") as f:
yaml.safe_dump(config, f)
# Then, process the jvm.options
with open(f"{CASSANDRA_CONFIG}/jvm-server.options") as f:
jvm_options = f.readlines()
if args.heap_size:
# Clean any old settings
for idx, l in enumerate(jvm_options):
if l.startswith("-Xms"):
jvm_options[idx] = ""
if l.startswith("-Xmx"):
jvm_options[idx] = ""
# Add heap size
jvm_options.append(f"-Xms{args.heap_size}G\n")
jvm_options.append(f"-Xmx{args.heap_size}G\n")
if args.affinity:
found = False
for idx, l in enumerate(jvm_options):
if l.startswith("-Dcassandra.available_processors"):
jvm_options[idx] = f"-Dcassandra.available_processors={args.affinity}\n"
found = True
if not found:
jvm_options.append("-Dcassandra.available_processors={args.affinity}\n")
# Write it back
with open(f"{CASSANDRA_CONFIG}/jvm-server.options", "w") as f:
f.writelines(jvm_options)
os.execvp("cassandra", ["cassandra", "-R", "-f"])
================================================
FILE: benchmarks/data-serving-relational/client/Dockerfile
================================================
FROM cloudsuite/base-os:ubuntu
ENV DEBIAN_FRONTEND noninteractive
# 1. install necessary software (sysbench)
RUN apt update && apt install git sysbench python3 -y
# 2. clone sysbench-tpcc's repo and install its script
RUN git clone https://github.com/Percona-Lab/sysbench-tpcc && cp sysbench-tpcc/*.lua /usr/share/sysbench/
# 3. Copy the template load file
COPY ./docker-entrypoint.py /root
COPY ./template/tpcc.py /root/template/tpcc.py
COPY ./template/oltp-rw.py /root/template/oltp-rw.py
COPY ./template/database.conf /root/template/database.conf
ENV DATABASE_CONF_FILE /root/template/database.conf
RUN chmod +x /root/docker-entrypoint.py
RUN chmod +x /root/template/tpcc.py
RUN chmod +x /root/template/oltp-rw.py
ENTRYPOINT ["/root/docker-entrypoint.py"]
================================================
FILE: benchmarks/data-serving-relational/client/docker-entrypoint.py
================================================
#!/usr/bin/env python3
import os
import sys
import subprocess
import argparse
args = sys.argv[1:]
parser = argparse.ArgumentParser()
parser.add_argument("--tpcc", help="Run TPC-C benchmark", action='store_true')
parser.add_argument("--oltp-rw", help="Run sysbench OLTP Read/Write workload", action='store_true')
parser.add_argument("--server-ip", help="IP of the server to load")
args_parsed, unknown = parser.parse_known_args()
if not args_parsed.server_ip:
print("Please pass the server IP as an argument with --server-ip=<IP>")
sys.exit()
print("args: " + str(args))
if not args_parsed.tpcc and not args_parsed.oltp_rw:
print("Precise whenever it's --tpcc or --oltp-rw")
sys.exit()
import os
import os.path as path
import shutil
def get_dict(lines):
config_dict = {}
for line in lines:
is_enabled = True
if "=" in line:
if line.startswith("#"):
is_enabled = False
line = line[1:] # Remove `#`
key, value = line.split("=", 1)
key = key.strip()
value = value.strip()
config_dict[key] = (value, is_enabled)
return config_dict
def save_dict(config_dict, lines):
# Reconstruct the updated configuration
new_lines = []
for line in lines:
if "=" in line:
if line.startswith("#"):
line = line[1:]
key, _ = line.split("=", 1)
key = key.strip()
if config_dict[key][1]:
new_lines.append(f"{key}={config_dict[key][0]}")
else:
new_lines.append(f"#{key}={config_dict[key][0]}")
else:
new_lines.append(line)
new_config = "\n".join(new_lines)
return new_config
DATABASE_CONF_FILE = os.environ["DATABASE_CONF_FILE"]
if not path.exists(f"{DATABASE_CONF_FILE}"):
shutil.copy(f"{DATABASE_CONF_FILE}", f"{DATABASE_CONF_FILE}.bak")
with open(f"{DATABASE_CONF_FILE}", "r") as f:
lines = f.readlines()
config_dict = get_dict(lines)
# Update the desired key with the new value
config_dict["pgsql-host"] = (args_parsed.server_ip, True)
file_txt = save_dict(config_dict, lines)
# Write it back
with open(f"{DATABASE_CONF_FILE}", "w") as f:
f.writelines(file_txt)
if args_parsed.tpcc:
subprocess.call(['/root/template/tpcc.py'] + args)
else:
subprocess.call(['/root/template/oltp-rw.py'] + args)
================================================
FILE: benchmarks/data-serving-relational/client/template/database.conf
================================================
db-driver=pgsql
pgsql-host=128.178.116.117
pgsql-port=5432
pgsql-user=cloudsuite
pgsql-password=cloudsuite
pgsql-db=sbtest
================================================
FILE: benchmarks/data-serving-relational/client/template/oltp-rw.py
================================================
#!/usr/bin/env python3
import os
import sys
import subprocess
import argparse
# According to the code, the table structure is like the following:
# - id: 4B (primary key)
# - key: 4B
# - c: 120B
# - pad: 60B
# As a result, each row takes 188B.
# You can increase the dataset size by adding more
parser = argparse.ArgumentParser()
parser.add_argument("--run", help="Run the benchmark, must be warmuped up before with --warmup", action='store_true')
parser.add_argument("--warmup", help="Warmup the benchmark, then can be ran with --run", action='store_true')
parser.add_argument("--threads", "-t", help="Number of threads for the client", default=8, type=int)
parser.add_argument("--report-interval", "-ri", help="Report interval for metrics in seconds", default=10, type=int)
parser.add_argument("--record-count", "-c", help="Record count per table. Each record is 188B", default=1000000, type=int)
parser.add_argument("--tables", "-n", help="Number of tables with `table_size` rows each", default=50, type=int)
parser.add_argument("--rate", "-r", help="The expected load (transaction / sec)", type=int)
parser.add_argument("--time", "-s", help="Length of the benchmark in seconds", default=360, type=int)
args_parsed, unknown = parser.parse_known_args()
# Warmup
if not args_parsed.warmup and not args_parsed.run:
print("Need to pass at least --run or --warmup argument")
exit()
if args_parsed.warmup:
os.system(f"sysbench oltp_read_write --config-file=/root/template/database.conf --threads={args_parsed.threads} --time={args_parsed.time} --report-interval={args_parsed.report_interval} prepare --table_size={args_parsed.record_count} --tables={args_parsed.tables}")
elif not args_parsed.rate:
os.system(f"sysbench oltp_read_write --config-file=/root/template/database.conf --threads={args_parsed.threads} --time={args_parsed.time} --report-interval={args_parsed.report_interval} run --table_size={args_parsed.record_count} --tables={args_parsed.tables}")
else:
os.system(f"sysbench oltp_read_write --config-file=/root/template/database.conf --threads={args_parsed.threads} --time={args_parsed.time} --report-interval={args_parsed.report_interval} run --table_size={args_parsed.record_count} --tables={args_parsed.tables} --rate={args_parsed.rate}")
================================================
FILE: benchmarks/data-serving-relational/client/template/tpcc.py
================================================
#!/usr/bin/env python3
import os
import sys
import subprocess
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--run", help="Run the benchmark, must be warmuped up before with --warmup", action='store_true')
parser.add_argument("--warmup", help="Warmup the benchmark, then can be ran with --run", action='store_true')
parser.add_argument("--threads", "-t", help="Number of threads for the client", default=8, type=int)
parser.add_argument("--report-interval", "-ri", help="Report interval for metrics in seconds", default=10, type=int)
parser.add_argument("--time", "-s", help="Length of the benchmark in seconds", default=360, type=int)
parser.add_argument("--scale", "-n", help="Scale of the dataset", default=10, type=int)
parser.add_argument("--rate", "-r", help="The expected load (transaction / sec)", type=int)
args_parsed, unknown = parser.parse_known_args()
# Warmup
if not args_parsed.warmup and not args_parsed.run:
print("Need to pass at least --run or --warmup argument")
exit()
if args_parsed.warmup:
os.system(f"sysbench tpcc --config-file=/root/template/database.conf --threads={args_parsed.threads} prepare --scale={args_parsed.scale}")
elif not args_parsed.rate:
os.system(f"sysbench tpcc --config-file=/root/template/database.conf --threads={args_parsed.threads} --time={args_parsed.time} --report-interval={args_parsed.report_interval} run --scale={args_parsed.scale}")
else:
os.system(f"sysbench tpcc --config-file=/root/template/database.conf --threads={args_parsed.threads} --time={args_parsed.time} --report-interval={args_parsed.report_interval} run --scale={args_parsed.scale} --rate={args_parsed.rate}")
================================================
FILE: benchmarks/data-serving-relational/server/Dockerfile
================================================
FROM cloudsuite/postgresql:15
# Install sudo for user switching
RUN apt update && apt install sudo python3 -y
# Make the database access public
RUN echo 'host\tall\tcloudsuite\t0.0.0.0/0\tscram-sha-256' >> /etc/postgresql/15/main/pg_hba.conf
# Copy the entrypoint
COPY ./docker-entrypoint.py /root
RUN chmod +x /root/docker-entrypoint.py
ENTRYPOINT ["/root/docker-entrypoint.py"]
================================================
FILE: benchmarks/data-serving-relational/server/docker-entrypoint.py
================================================
#!/usr/bin/env python3
import socket
def get_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(0)
try:
# doesn't even have to be reachable
s.connect(('8.8.8.8', 1))
IP = s.getsockname()[0]
except Exception:
IP = '127.0.0.1'
finally:
s.close()
return IP
import argparse
parser = argparse.ArgumentParser()
# If no value provided, the script tries to find the primary IP address by itself. = get_ip()
parser.add_argument("--listen-addresses", "-a", help="The listening IP address of PostGRES.", default="'*'")
parser.add_argument("--number", "-n", type=int, help="The number is not used, place holder for new argument.", default=0)
args, unknown = parser.parse_known_args()
import os
import os.path as path
import shutil
def get_dict(lines):
config_dict = {}
for line in lines:
is_enabled = True
if "=" in line:
if line.startswith("#"):
is_enabled = False
line = line[1:] # Remove `#`
key, value = line.split("=", 1)
key = key.strip()
value = value.strip()
config_dict[key] = (value, is_enabled)
return config_dict
def save_dict(config_dict, lines):
# Reconstruct the updated configuration
new_lines = []
for line in lines:
if "=" in line:
if line.startswith("#"):
line = line[1:]
key, _ = line.split("=", 1)
key = key.strip()
if config_dict[key][1]:
new_lines.append(f"{key} = {config_dict[key][0]}")
else:
new_lines.append(f"#{key} = {config_dict[key][0]}")
else:
new_lines.append(line)
new_config = "\n".join(new_lines)
return new_config
POSTGRE_HOMEDIR = os.environ["POSTGRE_HOME"]
# Backup the original file
if not path.exists(f"{POSTGRE_HOMEDIR}/postgresql.conf"):
shutil.copy(f"{POSTGRE_HOMEDIR}/postgresql.conf", f"{POSTGRE_HOMEDIR}/postgresql.conf.bak")
with open(f"{POSTGRE_HOMEDIR}/postgresql.conf", "r") as f:
lines = f.readlines()
config_dict = get_dict(lines)
# Update the desired key with the new value
config_dict["listen_addresses"] = (args.listen_addresses, True) # sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" /etc/postgresql/15/main/postgresql.conf
file_txt = save_dict(config_dict, lines)
# Write it back
with open(f"{POSTGRE_HOMEDIR}/postgresql.conf", "w") as f:
f.writelines(file_txt)
os.system("service postgresql start")
os.system("sudo -u postgres psql -c \"CREATE USER cloudsuite WITH PASSWORD 'cloudsuite';\"") # Create the user called `cloudsuite`
os.system("sudo -u postgres psql -c \"CREATE DATABASE sbtest;\"") # Create a table named sbtest
os.system("sudo -u postgres psql -c \"GRANT ALL PRIVILEGES ON DATABASE sbtest TO cloudsuite\"") # Gave permission to this table
os.system("sudo -u postgres psql sbtest -c \"GRANT ALL ON SCHEMA public TO cloudsuite;\"")
os.system("sudo -u postgres psql")
================================================
FILE: benchmarks/graph-analytics/latest/Dockerfile
================================================
FROM --platform=linux/amd64 cloudsuite/spark:3.3.2 as build
WORKDIR /root
# Copy files
COPY benchmark /root/benchmark
ENV SCALA_VERSION 2.13
# Build the benchmark using sbt
RUN set -ex \
&& apt-get update \
&& apt-get install apt-transport-https curl gnupg -y --no-install-recommends \
&& echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | tee /etc/apt/sources.list.d/sbt.list \
&& echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | tee /etc/apt/sources.list.d/sbt_old.list \
&& curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/scalasbt-release.gpg --import \
&& chmod 644 /etc/apt/trusted.gpg.d/scalasbt-release.gpg \
&& apt-get update -y \
&& apt-get install -y --no-install-recommends sbt \
&& rm -rf /var/lib/apt/lists/*
# build and save `.jar`
RUN cd /root/benchmark \
&& sbt package \
&& mv /root/benchmark/target/scala-$SCALA_VERSION/*.jar /root/benchmark/run_benchmark.sh /root \
&& apt-get purge -y --auto-remove sbt \
&& rm -r /root/benchmark \
&& rm -r /root/.sbt /root/.cache \
&& chmod +x /root/entrypoint.sh
FROM cloudsuite/spark:3.3.2
# copy data from the build container
COPY --from=build /root/graph-analytics-2.0.jar /root
COPY --from=build /root/run_benchmark.sh /root
COPY files/entrypoint.sh /root/entrypoint.sh
RUN chmod +x /root/entrypoint.sh /root/run_benchmark.sh
ENV BENCHMARK_JAR /root/graph-analytics-2.0.jar
# This input file comes from in `datasets/twitter-dataset-graph`
ENV INPUT_FILE /data/edges.csv
ENTRYPOINT ["/root/entrypoint.sh"]
================================================
FILE: benchmarks/graph-analytics/latest/benchmark/build.sbt
================================================
name := "Graph Analytics"
version := "2.0"
organization := "PARSA"
scalaVersion := "2.13.10"
artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
artifact.name + "-" + module.revision + "." + artifact.extension
}
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "3.3.2",
"org.apache.spark" %% "spark-graphx" % "3.3.2"
)
================================================
FILE: benchmarks/graph-analytics/latest/benchmark/run_benchmark.sh
================================================
#!/usr/bin/env bash
read -r -d '' USAGE << EOS
Usage: graph-analytics [SPARK_OPTIONS]
SPARK_OPTIONS are passed on to spark-submit.
EOS
if [ -n "$INPUT_FILE" ]; then
ARG_FILENAME=-file="${INPUT_FILE}"
fi
if [ -n "$WORKLOAD_NAME" ]; then
ARG_WORKLOAD=-app="${WORKLOAD_NAME}"
fi
if [ -n "$NUM_ITER" ]; then
ARG_NITERS=-niter="${NUM_ITER}"
fi
BENCHMARK_JAR=/root/graph-analytics-2.0.jar
echo "Executing with: $ARG_FILENAME $ARG_WORKLOAD $ARG_NITERS"
echo " SPARK_OPTIONS:"$@""
exec ${SPARK_HOME}/bin/spark-submit --class GraphAnalytics "$@" \
${BENCHMARK_JAR} $ARG_FILENAME $ARG_WORKLOAD $ARG_NITERS
================================================
FILE: benchmarks/graph-analytics/latest/benchmark/src/main/scala/GraphAnalytics.scala
================================================
import java.io.File
import scala.io.Source
/* Graph analytics */
import org.apache.spark._
import org.apache.spark.graphx._
// To make some of the examples work we will also need RDD
import org.apache.spark.rdd.RDD
object GraphAnalytics {
def main(args: Array[String]) : Unit = {
// val options: List[(String, String)] = List()
val options = args.map {
arg =>
arg.dropWhile(_ == '-').split('=') match {
case Array(opt, v) => (opt -> v)
case _ => throw new IllegalArgumentException("Invalid argument: " + arg)
}
}
var app = "pr"
var niter = 3
var edgesFilename = "EDGES_FILES"
options.foreach {
case ("app", v) => app = v
case ("niter", v) => niter = v.toInt
case ("file", v) => edgesFilename = v
case (opt, _) => throw new IllegalArgumentException("Invalid option: " + opt)
}
val conf = new SparkConf().setAppName("Graph analytics")
val sc = new SparkContext(conf)
val graph = GraphLoader.edgeListFile(sc, edgesFilename)
graph.cache()
var startTime = System.currentTimeMillis()
if (app == "pr") {
println("Running PageRank")
val totalPR = graph.staticPageRank(niter).vertices.map(_._2).sum()
println(s"Total PageRank = $totalPR")
} else if (app == "cc") {
println("Running Connected Components")
val numComponents = graph.connectedComponents().vertices.map(_._2).distinct().count()
println(s"Number of components = $numComponents")
} else if (app == "tc") {
println("Running Triangle Counting")
val triangleCnt = graph.triangleCount().vertices.map(_._2).distinct().count()
println(s"Number of triangles = $triangleCnt")
}
val runTime = System.currentTimeMillis() - startTime
println(s"Running time = $runTime")
}
}
================================================
FILE: benchmarks/graph-analytics/latest/files/entrypoint.sh
================================================
#!/usr/bin/env bash
exec /root/run_benchmark.sh "$@"
================================================
FILE: benchmarks/in-memory-analytics/latest/Dockerfile
================================================
FROM --platform=linux/amd64 cloudsuite/spark:3.3.2 as build
WORKDIR /root
# Benchmark files
COPY movielens-als /root/movielens-als
COPY files /root/
ENV SCALA_VERSION 2.13
# Build the benchmark using sbt
RUN set -ex \
&& apt-get update \
&& apt-get install apt-transport-https curl gnupg -y --no-install-recommends \
&& echo "deb https://repo.scala-sbt.org/scalasbt/debian all main" | tee /etc/apt/sources.list.d/sbt.list \
&& echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | tee /etc/apt/sources.list.d/sbt_old.list \
&& curl -sL "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x2EE0EA64E40A89B84B2DF73499E82A75642AC823" | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/scalasbt-release.gpg --import \
&& chmod 644 /etc/apt/trusted.gpg.d/scalasbt-release.gpg \
&& apt-get update -y \
&& apt-get install -y --no-install-recommends sbt \
&& rm -rf /var/lib/apt/lists/*
RUN cd /root/movielens-als \
&& sbt package \
&& mv /root/movielens-als/target/scala-${SCALA_VERSION}/*.jar /root/movielens-als/run_benchmark.sh /root \
&& apt-get purge -y --auto-remove sbt \
&& rm -r /root/movielens-als \
&& rm -r /root/.sbt /root/.cache \
&& chmod +x /root/entrypoint.sh
FROM cloudsuite/spark:3.3.2
# copy the old file
COPY --from=build /root/movielens-als-2.0.jar /root
COPY --from=build /root/run_benchmark.sh /root
COPY /files/entrypoint.sh /root/entrypoint.sh
ENV BENCHMARK_JAR /root/movielens-als-2.0.jar
ENTRYPOINT ["/root/entrypoint.sh"]
================================================
FILE: benchmarks/in-memory-analytics/latest/files/entrypoint.sh
================================================
#!/usr/bin/env bash
exec /root/run_benchmark.sh "$@"
================================================
FILE: benchmarks/in-memory-analytics/latest/files/spark-defaults.conf
================================================
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Default system properties included when running spark-submit.
# This is useful for setting default environmental settings.
# Example:
# spark.master spark://master:7077
# spark.eventLog.enabled true
# spark.eventLog.dir hdfs://namenode:8021/directory
# spark.serializer org.apache.spark.serializer.KryoSerializer
# spark.driver.memory 5g
# spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
================================================
FILE: benchmarks/in-memory-analytics/latest/files/spark-env.sh
================================================
#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This file is sourced when running various Spark programs.
# Copy it as spark-env.sh and edit that to configure Spark for your site.
# Options read when launching programs locally with
# ./bin/run-example or ./bin/spark-submit
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public dns name of the driver program
# Options read by executors and drivers running inside the cluster
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public DNS name of the driver program
# - SPARK_LOCAL_DIRS, storage directories to use on this node for shuffle and RDD data
# - MESOS_NATIVE_JAVA_LIBRARY, to point to your libmesos.so if you use Mesos
# Options read in YARN client/cluster mode
# - SPARK_CONF_DIR, Alternate conf dir. (Default: ${SPARK_HOME}/conf)
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - YARN_CONF_DIR, to point Spark towards YARN configuration files when you use YARN
# - SPARK_EXECUTOR_CORES, Number of cores for the executors (Default: 1).
# - SPARK_EXECUTOR_MEMORY, Memory per Executor (e.g. 1000M, 2G) (Default: 1G)
# - SPARK_DRIVER_MEMORY, Memory for Driver (e.g. 1000M, 2G) (Default: 1G)
# Options for the daemons used in the standalone deploy mode
# - SPARK_MASTER_HOST, to bind the master to a different IP address or hostname
# - PARK_MASTER_OPTS, to set config properties only for the master (e.g. "-Dx=y")
# - SPARK_WORKER_CORES, to set the number of cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how much total memory workers have to give executors (e.g. 1000m, 2g)
# - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT, to use non-default ports for the worker
# - SPARK_WORKER_DIR, to set the working directory of worker processes
# - SPARK_WORKER_OPTS, to set config properties only for the worker (e.g. "-Dx=y")
# - SPARK_DAEMON_MEMORY, to allocate to the master, worker and history server themselves (default: 1g).
# - SPARK_HISTORY_OPTS, to set config properties only for the history server (e.g. "-Dx=y")
# - SPARK_SHUFFLE_OPTS, to set config properties only for the external shuffle service (e.g. "-Dx=y")
# - SPARK_DAEMON_JAVA_OPTS, to set config properties for all daemons (e.g. "-Dx=y")
# - SPARK_DAEMON_CLASSPATH, to set the classpath for all daemons
# - SPARK_PUBLIC_DNS, to set the public dns name of the master or workers
# Generic options for the daemons used in the standalone deploy mode
# - SPARK_CONF_DIR Alternate conf dir. (Default: ${SPARK_HOME}/conf)
# - SPARK_LOG_DIR Where log files are stored. (Default: ${SPARK_HOME}/logs)
# - SPARK_PID_DIR Where the pid file is stored. (Default: /tmp)
# - SPARK_IDENT_STRING A string representing this instance of spark. (Default: $USER)
# - SPARK_NICENESS The scheduling priority for daemons. (Default: 0)
# - SPARK_NO_DAEMONIZE Run the proposed command in the foreground. It will not output a PID file.
# Options for native BLAS, like Intel MKL, OpenBLAS, and so on.
# You might get better performance to enable these options if using native BLAS (see SPARK-21305).
# - MKL_NUM_THREADS=1 Disable multi-threading of Intel MKL
# - OPENBLAS_NUM_THREADS=1 Disable multi-threading of OpenBLAS
================================================
FILE: benchmarks/in-memory-analytics/latest/movielens-als/build.sbt
================================================
name := "movielens-als"
version := "2.0"
organization := "PARSA"
scalaVersion := "2.13.10"
artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
artifact.name + "-" + module.revision + "." + artifact.extension
}
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "3.3.2",
"org.apache.spark" %% "spark-sql" % "3.3.2",
"org.apache.spark" %% "spark-mllib" % "3.3.2"
)
================================================
FILE: benchmarks/in-memory-analytics/latest/movielens-als/run_benchmark.sh
================================================
#!/usr/bin/env bash
read -r -d '' USAGE << EOS
Usage: in-memory-analytics DATASET RATINGS [SPARK_OPTIONS]
DATASET is the dataset directory (e.g. /data/ml-latest-small).
RATINGS is the rating file (e.g. /data/myratings.csv).
SPARK_OPTIONS are passed on to spark-submit.
EOS
if [[ $# -lt 2 ]]; then
echo "$USAGE"
exit 1
fi
DATASET=$1
shift
RATINGS=$1
shift
echo "Executing with: DATASET:${DATASET} RATINGS:${RATINGS}"
echo " SPARK_OPTIONS:"$@""
exec ${SPARK_HOME}/bin/spark-submit --class MovieLensALS "$@" \
${BENCHMARK_JAR} $DATASET $RATINGS
================================================
FILE: benchmarks/in-memory-analytics/latest/movielens-als/src/main/scala/MovieLensALS.scala
================================================
import java.io.File
import scala.io.Source
import org.apache.log4j.Logger
import org.apache.log4j.Level
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.rdd._
import org.apache.spark.mllib.recommendation.{ALS, Rating, MatrixFactorizationModel}
object MovieLensALS {
def main(args: Array[String]) : Unit = {
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
if (args.length != 2) {
println("Example: /path/to/spark/bin/spark-submit --driver-memory 2g --class MovieLensALS " +
"target/scala-*/movielens-als-ssembly-*.jar movieLensHomeDir personalRatingsFile")
sys.exit(1)
}
// set up environment
val conf = new SparkConf()
.setAppName("MovieLensALS")
val sc = new SparkContext(conf)
// time the execution
val t0 = System.currentTimeMillis
// load personal ratings
val myRatings = loadRatings(args(1))
val myRatingsRDD = sc.parallelize(myRatings, 1)
// load ratings and movie titles
val movieLensHomeDir = args(0)
val ratingsFile = sc.textFile(new File(movieLensHomeDir, "ratings.csv").toString)
val ratingsFileHeader = ratingsFile.first()
val ratings = ratingsFile.filter{ line => line != ratingsFileHeader }.map { line =>
val fields = line.split(",")
// format: (timestamp % 10, Rating(userId, movieId, rating))
(fields(3).toLong % 10, Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble))
}
val moviesFile = sc.textFile(new File(movieLensHomeDir, "movies.csv").toString)
val moviesFileHeader = moviesFile.first()
val movies = moviesFile.filter{ line => line != moviesFileHeader }.map { line =>
val fields = line.split(",")
// format: (movieId, movieName)
(fields(0).toInt, fields(1))
}.collect().toMap
val numRatings = ratings.count()
val numUsers = ratings.map(_._2.user).distinct().count()
val numMovies = ratings.map(_._2.product).distinct().count()
println("Got " + numRatings + " ratings from "
+ numUsers + " users on " + numMovies + " movies.")
// split ratings into train (60%), validation (20%), and test (20%) based on the
// last digit of the timestamp, add myRatings to train, and cache them
val numPartitions = 4
val training = ratings.filter(x => x._1 < 6)
.values
.union(myRatingsRDD)
.repartition(numPartitions)
.cache()
val validation = ratings.filter(x => x._1 >= 6 && x._1 < 8)
.values
.repartition(numPartitions)
.cache()
val test = ratings.filter(x => x._1 >= 8).values.cache()
val numTraining = training.count()
val numValidation = validation.count()
val numTest = test.count()
println("Training: " + numTraining + ", validation: " + numValidation + ", test: " + numTest)
// train models and evaluate them on the validation set
val ranks = List(8, 12)
val lambdas = List(0.1, 10.0)
val numIters = List(10, 20)
var bestModel: Option[MatrixFactorizationModel] = None
var bestValidationRmse = Double.MaxValue
var bestRank = 0
var bestLambda = -1.0
var bestNumIter = -1
for (rank <- ranks; lambda <- lambdas; numIter <- numIters) {
val model = ALS.train(training, rank, numIter, lambda)
val validationRmse = computeRmse(model, validation, numValidation)
println("RMSE (validation) = " + validationRmse + " for the model trained with rank = "
+ rank + ", lambda = " + lambda + ", and numIter = " + numIter + ".")
if (validationRmse < bestValidationRmse) {
bestModel = Some(model)
bestValidationRmse = validationRmse
bestRank = rank
bestLambda = lambda
bestNumIter = numIter
}
}
// evaluate the best model on the test set
val testRmse = computeRmse(bestModel.get, test, numTest)
println("The best model was trained with rank = " + bestRank + " and lambda = " + bestLambda
+ ", and numIter = " + bestNumIter + ", and its RMSE on the test set is " + testRmse + ".")
// create a naive baseline and compare it with the best model
val meanRating = training.union(validation).map(_.rating).mean()
val baselineRmse =
math.sqrt(test.map(x => (meanRating - x.rating) * (meanRating - x.rating)).mean())
val improvement = (baselineRmse - testRmse) / baselineRmse * 100
println("The best model improves the baseline by " + "%1.2f".format(improvement) + "%.")
// make personalized recommendations
val myRatedMovieIds = myRatings.map(_.product).toSet
val candidates = sc.parallelize(movies.keys.filter(!myRatedMovieIds.contains(_)).toSeq)
val recommendations = bestModel.get
.predict(candidates.map((0, _)))
.collect()
.sortBy(- _.rating)
.take(50)
var i = 1
println("Movies recommended for you:")
recommendations.foreach { r =>
println("%2d".format(i) + ": " + movies(r.product))
i += 1
}
// time the execution
val te = System.currentTimeMillis - t0
println("Benchmark execution time: " + te + "ms")
// clean up
sc.stop()
}
/** Compute RMSE (Root Mean Squared Error). */
def computeRmse(model: MatrixFactorizationModel, data: RDD[Rating], n: Long): Double = {
val predictions: RDD[Rating] = model.predict(data.map(x => (x.user, x.product)))
val predictionsAndRatings = predictions.map(x => ((x.user, x.product), x.rating))
.join(data.map(x => ((x.user, x.product), x.rating)))
.values
math.sqrt(predictionsAndRatings.map(x => (x._1 - x._2) * (x._1 - x._2)).reduce(_ + _) / n)
}
/** Load ratings from file. */
def loadRatings(path: String): Seq[Rating] = {
val lines = Source.fromFile(path).getLines()
val ratings = lines.map { line =>
val fields = line.split(",")
Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble)
}.filter(_.rating > 0.0)
if (ratings.isEmpty) {
sys.error("No ratings provided.")
} else {
ratings.toSeq
}
}
}
================================================
FILE: benchmarks/media-streaming/client/Dockerfile
================================================
FROM cloudsuite/base-os:ubuntu
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
bc \
build-essential \
libssl-dev \
&& rm -rf /var/lib/apt/lists/*
COPY files /root/
RUN set -x \
&& mkdir -p /root/build \
&& cd /root/build \
&& /root/videoperf/configure \
&& make \
&& make install
RUN chmod +x /root/docker-entrypoint.sh
RUN rm -rf /output && mkdir -p /output
VOLUME ["/output"]
RUN rm -rf /videos/logs && mkdir -p /videos/logs
VOLUME [ "/videos/logs" ]
ENTRYPOINT ["/root/docker-entrypoint.sh"]
================================================
FILE: benchmarks/media-streaming/client/files/docker-entrypoint.sh
================================================
#!/bin/bash
set -e
# $1: the IP of the server
# $2: the number of httperf clients
# $3: the total number of sessions
# $4: the rate (sessions per seconds)
# $5: plain text or encrypted communication, possible values are "PT" and "TLS"
if [ "$1" = "bash" ]; then
exec $@
else
cd /root/run && exec ./benchmark.sh $1 $2 $3 $4 $5
fi
================================================
FILE: benchmarks/media-streaming/client/files/run/benchmark.sh
================================================
#!/bin/bash
server_ip=$1
num_clients_per_machine=${2:-4}
num_sessions=${3:-100}
rate=${4:-10}
mode=${5:-TLS}
streaming_client_dir=..
#server_ip=$(tail -n 1 hostlist.server)
peak_hunter/launch_hunt_bin.sh \
$server_ip \
hostlist.client \
$streaming_client_dir \
$num_clients_per_machine \
$num_sessions \
$rate \
$mode
./process_logs.sh
================================================
FILE: benchmarks/media-streaming/client/files/run/hostlist.client
================================================
localhost
================================================
FILE: benchmarks/media-streaming/client/files/run/hostlist.server
================================================
streaming_server
================================================
FILE: benchmarks/media-streaming/client/files/run/peak_hunter/launch_hunt_bin.sh
================================================
#!/bin/bash
videoServerIp="$1"
hostFileName="$2"
remoteOutputPath="$3"
numClientsPerHost="$4"
totalNumSessions="$5"
rate="$6"
mode="$7"
if [ $# -ne 7 ]; then
echo "Usage: launch_hunt_bin.sh <video_server_ip> <host_list_file> <remote_output_path> <num_clients_per_host> <total_num_sessions> <rate> <encryption_mode>"
exit
fi
# Distribute the load
numHosts=$(wc -l < $hostFileName)
numTotalClients=$[$numHosts*$numClientsPerHost]
NumSessions=$[$totalNumSessions/$numTotalClients]
rate=`echo "scale=2; $rate/$numTotalClients" | bc`
echo "Total clients = $numTotalClients"
echo "Total number of sessions = $totalNumSessions"
outputDir="/output"
backUpStdoutDir="/output-stdout"
rm -rf "$outputDir/*" "$backUpStdoutDir"
mkdir -p "$outputDir" "$backUpStdoutDir"
# Launches remote with the specified number of sessions.
function launchRemote () {
totalConns=0
totalErrors=0
numSessions="$1"
$(dirname $0)/launch_remote.sh $videoServerIp $hostFileName $remoteOutputPath $numClientsPerHost $numSessions $rate $mode
if [ $? -ne 0 ]; then
echo 'Failed launching remote... exiting.'
exit
fi
# Open each file in output directory
totalConns=0
for outputFile in $outputDir/*;
do
numConns="$(grep 'Total: connections' $outputFile | awk '{print $3}')"
numErrors="$(grep 'Errors: total' $outputFile | awk '{print $3}')"
totalConns=$[totalConns+numConns]
totalErrors=$[totalErrors+numErrors]
done
if [ $totalConns -eq 0 ]; then
echo "No log is found from the log folder: $outputDir"
echo "Please check the the folder exists, or whether any request is sent during the test"
else
percFailure=$[$totalErrors*100/$totalConns]
echo "Total connections = $totalConns"
echo "Total errors = $totalErrors"
echo "Percentage failure = $percFailure"
if [ "$percFailure" -gt 5 ]; then
cp $backUpStdoutDir/* $outputDir
sleep 10
else
cp $outputDir/* $backUpStdoutDir
fi
fi
}
# Test for NumSessions
launchRemote $NumSessions
exit 0
================================================
FILE: benchmarks/media-streaming/client/files/run/peak_hunter/launch_remote.sh
================================================
#!/bin/bash
videoServerIp="$1"
hostFileName="$2"
remoteOutputPath="$3"
numClientsPerHost="$4"
numSessions="$5"
rate="$6"
mode="$7"
if [ $# -ne 7 ]; then
echo "Usage: launch_remote.sh <video_server_ip> <host_list_file> <remote_output_path> <num_clients_per_host> <num_sessions> <rate> <encryption_mode>"
exit
fi
if [ $mode = "PT" ];then
mode="--port 80"
elif [ $mode = "TLS" ]; then
mode="--ssl --port 443 --ssl-ciphers TLS_AES_128_GCM_SHA256"
else
echo "invalid encryption mode flag"
exit
fi
# TODO: this needs to be fixed - need static correspondence between log, ratio, and ip
logs=$(echo /videos/logs/cl* | sed -e 's/ /,/g')
while read hostLine
do
sIFS=$IFS; IFS=' :'; declare -a d=($hostLine); IFS=$sIFS
host=${d[0]}
#ips=$(echo ${d[@]:1:100} | sed -e 's/-[^ ]*//g' -e 's/ /,/g')
#ssh $host "sudo mkdir -m 0777 -p $remoteOutputPath/results"
echo "Launching $numClientsPerHost clients on $host";
for i in $(seq 1 $numClientsPerHost)
do
cmd="httperf --hog --server $videoServerIp --videosesslog=[$logs],[0.1,0.3,0.4,0.2],[localhost,localhost,localhost,localhost] --epoll --recv-buffer=524288 $mode --output-log=/output/result$i.log --num-sessions=$numSessions --rate=$rate 2>>/output/bt$i.trace" # > output-stdout/stdout$i"
echo "Running command $cmd"
eval $cmd &
done
wait
done < "$hostFileName"
================================================
FILE: benchmarks/media-streaming/client/files/run/process_logs.sh
================================================
#!/bin/bash
output_dir=${1:-/output}
nFiles=0
nRequests=0
nReplies=0
replyRateAcc=0
replyTimeAcc=0
netIOAcc=0
for resultFile in $output_dir/*.log; do
if [ -f $resultFile ]; then
nFiles=$(echo $nFiles + 1 | bc)
x=$(grep 'Total:' $resultFile | awk '{print $5}')
nRequests=$(echo "$nRequests" + "$x" | bc)
x=$(grep 'Total:' $resultFile | awk '{print $7}')
nReplies=$(echo "$nReplies + $x" | bc)
x=$(grep 'Reply rate' $resultFile | awk '{print $7}')
replyRateAcc=$(echo "$replyRateAcc + $x" | bc)
x=$(grep 'Reply time' $resultFile | awk '{print $5}')
replyTimeAcc=$(echo "$replyTimeAcc + $x" | bc)
x=$(grep 'Net I/O:' $resultFile | awk '{print $3}')
netIOAcc=$(echo "$netIOAcc + $x" | bc)
fi
done
if [ $nFiles -eq 0 ]; then
echo "No log is found from the log folder: $output_dir"
echo "Please check the the folder exists, or whether any request is sent during the test"
else
echo Requests: $nRequests
echo Replies: $nReplies
echo Reply rate: $(echo "scale=2; $replyRateAcc / $nFiles" | bc)
echo Reply time: $(echo "scale=2; $replyTimeAcc / $nFiles" | bc)
echo Net I/O: $netIOAcc
for btFile in $output_dir/*.trace; do
if [ -f $btFile ]; then
cat $btFile | /root/videoperf/bt2line $(which httperf)
fi
done
fi
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/AUTHORS
================================================
David Mosberger (main sources)
Martin Arlitt (SSL support)
Stephane Eranian (wlog URI generator)
Richard Carter (wsesslog workload generator)
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/COPYRIGHT
================================================
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/ChangeLog
================================================
2012-10-30 Tim Brecht <brecht@cs.uwaterloo.ca>
* Version 0.8.6b and 0.8.6c
* Removed some debugging statements
* Did a lot of work to get clean compilation on multiple platforms
so we can turn on -Werror
2012-10-17 Tim Brecht <brecht@cs.uwaterloo.ca>
* Version 0.8.6
* Fixed weird issue with s->id being long and comparing with u_long
and comparison failing
* Added code from Tyler Szepesi for tracking
statistics based on each call and for specifying a timeout
for each entry in a wsession log file.
From Jim Summers for elimintating ramp up and ramp down periods,
and for staggering the starts of multiple clients so they
aren't in sync, and for adding pacing requests to wsession log files.
2011-12-14 Tim Brecht <brecht@cs.uwaterloo.ca>
* Version 0.8.5
* TBB - added code from Adam Gruttner for handling headers in wsesslog files.
2004-10-21 Tim Brecht <brecht@cs.uwaterloo.ca>
Vikram Saletore <vikram.a.saletore@intel.com>
* Version 0.8.4
* TBB fixed problem with non blocking connects all being treated
as though they were successful
* TBB and VAS added counters to keep track of the number
of connections that are actually connected
(to track current connected and max connected).
2003-10-3 Tim Brecht <brecht@cs.uwaterloo.ca>
* httperf.h changed version number
* modified configure file to include -ldl with cyrpto for static
binaries
* added -I/usr/include/kerberos for compilation on RH 9.0
* fixed some of the error messages
* added debugging messages
* modified the way zero bytes files are handled
(this modification doesn't work if a trailer is also included
but it works for our needs)
* added a few include <stdlib.h> to provide prototypes for exit()
David Pariag <db2pariag@cs.uwaterloo.ca>
* added rate-interval to permit finer grained printing of reply rates
2000-10-31 David Mosberger <davidm@hpl.hp.com>
* Version 0.8 released.
* core.c (do_recv) [!HAVE_SSL]: Avoid referncing param.use_ssl.
(do_send): Ditto.
* core.c (core_ssl_connect): Print error message if SSL connect
fails. ERR_print_errors_fp() may not print anything if there
error is due to, e.g., trying to connect to a non-existent port.
* httperf.c (main): Initialize port to -1. Once parameters have
been processed, port defaults to 443 if SSL is in use, 80
otherwise.
2000-10-30 David Mosberger <davidm@hpl.hp.com>
* httperf.man: Update man-page with new options (based on Martin's
descriptions.
* httperf.c (usage): Mention --port.
2000-10-27 David Mosberger <davidm@hpl.hp.com>
* httperf.man: Mention request summary in description of
--print-request.
* stat/print_reply.c (print_request): Print request header/content
summary line.
* httperf.c (usage): Bring in sync with implemented options
(Martin's patch).
(longopts): Order in alphabetical order (Martin's patch).
2000-10-25 David Mosberger <davidm@hpl.hp.com>
* stat/print_reply.c (flush_print_buf): New.
(Call_Private_Data): New.
(CALL_PRIVATE_DATA): New.
(call_private_data_offset): New.
(print_buf): Rewrite to support line-buffering and new output
format.
(call_destroyed): New.
(print_reply_hdr): New (based on Martin's original version).
(send_raw_data): Ditto.
(recv_raw_data): Ditto.
(recv_stop): Print reply summary (based on Martin's version).
(init): Update to support the new print options.
* httperf.c: Replace --print-replies/--print-request with more
general versions of these options.
* httperf.man: Add info on new --print-reply and --print-request
options.
2000-10-24 David Mosberger <davidm@hpl.hp.com>
* httperf.c (main): Initialize ssl_ctx.
(main): Use SSLv3_client_method() instead of SSLv23_client_method().
The latter doesn't work.
* httperf.h (ssl_ctx): New global variable.
* conn.h [HAVE_SSL]: Drop unnecessary includes of <openssl/rsa.h>,
<openssl/crypto.h>, <openssl/x509.h>, and <openssl/pem.h>. Drop
per-connect "ctx" member (it's global now).
* conn.c (conn_init): Create SSL connection info and set cipher
list (if necessary).
* core.c (core_ssl_connect): Don't create SSL connection info
here (done in conn.c now). Always tell SSL about the
file descriptor of the socket.
* sess.c (sess_deinit) [HAVE_SSL]: Free SSL info if it exists.
* gen/session.c (create_conn): If param.ssl_reuse is in effect,
re-use SSL session if we have one or update session info with
newly created SSL session.
* httperf.c [HAVE_SSL]: Include <openssl/rand.h>.
(main): Call RAND_seed() with a zero buffer.
2000-10-23 David Mosberger <davidm@hpl.hp.com>
* conn.c (conn_init): Don't initialize conn->ssl to zero---that
has been done by object_new() already.
* gen/session.c (create_conn): If reusing SSL session ids, create
SSL structure and save SSL info in session structure.
* sess.c (sess_deinit) [HAVE_SSL]: Free SSL session if it's
non-NULL.
* httperf.h: Declare "use_ssl" only if HAVE_SSL is defined.
Add ssl_no_reuse and ssl_cipher_list.
* httperf.c (struct longopts): Add --ssl-no-reuse and ssl-ciphers.
(main): Handle --ssl-cipher_list and --ssl-no-reuse options.
2000-10-19 David Mosberger <davidm@hpl.hp.com>
* core.c (core_ssl_connect): Bring debug messages in sync with
rest of httperf. If s->ssl exists already, skip right to
SSL_connect(). If SSL_connect() returns SSL_ERROR_WANT_READ or
SSL_ERROR_WANT_WRITE, mark the appropriate fd set as active and
return immediately to wait for more data. Use
ERR_print_errors_fp() to print SSL-related errors.
(core_loop): Check for S_CONNECTING state before doing anything
else.
* README: Document configuration option "--enable-debug".
* configure.in: Add support for --enable-debug.
2000-10-16 David Mosberger <davidm@hpl.hp.com>
* configure.in: Add AC_TYPE_LONG_LONG check (defines u_wide as
"unsigned long long" if the compiler can grok it, "unsigned long"
otherwise).
* aclocal.m4: New file.
* stat/basic.c: Include "config.h".
(struct basic): Change type of hdr_bytes_received,
reply_bytes_received, and footer_bytes_received from
size_t to u_wide.
(dump): Change type of total_size to u_wide.
2000-10-11 David Mosberger <davidm@hpl.hp.com>
* httperf.h (VERSION): Change to 0.8beta.
* configure.in: New file.
* Makefile.in: Ditto.
* stat/Makefile.in: Ditto.
* gen/Makefile.in: Ditto.
* lib/Makefile.in: Ditto.
2000-08-29 David Mosberger <davidm@hpl.hp.com>
* httperf.c (main): Call core_exit() on a SIGINT.
2000-08-21 David Mosberger <davidm@hpl.hp.com>
* core.c (core_init): Bound maximum number of open files to
FD_SETSIZE.
2000-04-25 David Mosberger <davidm@hpl.hp.com>
* httperf.c (main): Add a call to fpsetmask(0) to get non-finite
IEEE arithmetic to work on older versions of FreeBSD.
1998-12-21 David Mosberger <davidm@hpl.hp.com>
* Version 0.7 released.
* Makefile (install): New make target.
* httperf.h (VERSION): Define as "0.7".
* gen/wsesslog.c (parse_config): Remove blank in sscanf() format
since this caused problems on FreeBSD and NetBSD. This bug was
reported by Stephane Eranian.
1998-12-08 David Mosberger <david_mosberger@hp.com>
* httperf.c (struct longopts): Add option "method".
(usage): Document option --method.
(main): Handle --method.
* httperf.h (struct Cmdline_Params): New member "method".
* gen/misc.c: Renamed from add_header.c. This file now implements
both --add-header and --method.
1998-11-23 David Mosberger <david_mosberger@hp.com>
* httperf.c (longopts): New option "add-header".
(main): Handle --add-header.
* httperf.h (struct Cmdline_Params): New member
"additional_header".
* gen/add_header.c: New file.
1998-09-18 David Mosberger <davidm@hpl.hp.com>
* gen/session.c (call_done):
(conn_failed): Call create_conn() instead of sess_failure() in
case param.retry_on_failure is set and the connection has not been
successful (received at least one good response)
* gen/wsess.c (call_destroyed): Call sess_dec_ref() only if
session didn't fail.
1998-09-14 David Mosberger <davidm@hpl.hp.com>
* README: Replace "session" with "connection" and "call" with
"request" to reflect current terminology (reported by Christian
Petit). Also fixed various other typos and grammatical problems.
1998-09-11 David Mosberger <davidm@hpl.hp.com>
* gen/session.c (call_done): When param.retry_on_failure is set,
re-issue call instead of causing session to fail.
* httperf.c (usage): Add --retry-on-failure option.
(struct longopts): Ditto.
* httperf.man: Document --retry-on-failure option.
1998-07-23 David Mosberger <davidm@hpl.hp.com>
* stat/sess_stat.c: Use sess->failed instead of maintaining
private session-failure flag.
1998-07-21 David Mosberger <davidm@hpl.hp.com>
* sess.c (sess_failure): Don't signal EV_SESS_FAILED more than
once per session.
* core.c (do_send): Clear c->recvq_next. This is necessary now
because the same call may be issued multiple times (due to
connection failures). Hence there is no longer a guarantee that
c->recvq_next has been cleared by object_new().
(do_send): Rename s to conn and c to call.
1998-07-20 David Mosberger-Tang <David.Mosberger@acm.org>
* core.c (do_recv): Set s->state to S_REPLY_DONE when done with an
HTTP/1.0 response (mirrors code in http_process_reply_bytes()).
(do_recv): No need to check for nread == 0.
* stat/basic.c (init): Print basic.conn_lifetime_min only if
basic.num_lifetimes > 0.
* core.c (core_close): Fix typo (call -> all).
1998-07-08 David Mosberger <davidm@hpl.hp.com>
* core.c (do_send): Set s->state to S_REPLY_STATUS only if this is
the first send---we don't want to interfere with the parsing of an
in-progress reply.
1998-06-19 David Mosberger <davidm@hpl.hp.com>
* Version 0.6 released.
* gen/wsesslog.c (issue_calls): Limit `to_create' by the number
of calls that the session can queue.
* gen/session.c (session_max_qlen): New function.
(session_current_qlen): Ditto.
(max_qlen): New variable.
* httperf.man: Fix typos.
1998-06-18 David Mosberger <davidm@hpl.hp.com>
* gen/session.c (MAX_CONN): Up MAX_CONN to 16.
* object.c (object_new): panic() instead of assert(0) when
encountering an unknown object type.
* gen/wsesslog.c (user_think_time_expired): Remove stale comment.
* gen/sess_cookie.c (struct Call_Private_Data): New member cookie.
(call_recv_hdr): Remove padding bogosity.
(call_issue): Copy cookie from session to call object.
1998-06-17 David Mosberger <davidm@hpl.hp.com>
* timer.c (timer_cancel): Instead of an assertion failure, print a
message on stderr when timer_cancel(t) is called from within a
timeout handler t.
* Feedback from Dick Carter:
* gen/wsesslog.c (parse_config): Remove stale comment.
* httperf.h: Fix typo in comment for min_iat.
* httperf.c (usage): Fix typo in --period args.
* call.c (call_append_request_header): Fix typo in debug message.
1998-06-09 David Mosberger <davidm@hpl.hp.com>
* stat/print_reply.c: New file.
* stat/sess_stat.c: Ditto.
* stat/wsess_stat.c: Remove.
* stat/basic.c: Move stats macros into stats.h.
(RATE_INTERVAL): Remove.
(interval_start): Ditto.
(perf_sample): Rename from sample_rate().
(conn_fail): Count EPIPE as a `connection reset' error.
(init): Register perf_sample as handler for EV_PERF_SAMPLE.
Remove scheduling of performance sampling timer.
(dump): Print connection lifetime histogram only if verbose > 1.
Print average connection length in number of replies/connection.
* stat/stats.h: New file.
* stat/basic.c: Add copyright message.
* stat/Makefile (libstat.a): Mention sess_stat.o and
print_reply.o.
* object.c: New file.
* object.h: Ditto.
* sess.c: Ditto.
* sess.h: Ditto.
* httperf.h (VERSION): Up version number to 0.6.
(object_is_conn): Remove (now in object.h).
(object_is_call): Ditto.
(enum Object_Type): Ditto.
(struct Object): Ditto.
(object_type_size): Ditto.
(struct Cmdline_Params): New mebers max_piped, max_conns,
print_replies, and session_cookies.
* httperf.c (perf_sample_start): New variable to keep track of
when latest sample interval started.
(struct longopts): Add entries for max-connections,
max-piped-calls, print-replies, and session-cookies.
(usage): Update usage() message.
(perf_sample): New function.
(main): Remove uri_wsesslog generator. Add sess_stat stats
collector. Handle --max-connections, --max-piped, --print-replies
and --session-cookies. Start performance sampling timer.
* http.c (get_line): Use sizeof (s->line_buf) instead of
s->line_buf_size.
(parse_status_line): Do strcmp() to find out whether call
was a HEAD request. Ignore `100 Continue' replies.
* gen/wsesslog.h: Remove.
* gen/wsess.c: Modify to take advantage of session manager
(gen/session.c).
* gen/wsesslog.c: Modify to take advantage of session manager
and merge with uri_wsesslog.c.
* gen/uri_wlog.c (set_uri): Use call_set_uri().
* gen/uri_wset.c (set_uri): Ditto.
* gen/uri_fixed.c (uri_len): New variable.
(set_uri): Use call_set_uri().
(init): Initialize uri_len.
* gen/session.c: New file.
* gen/session.h: Ditto.
* gen/sess_cookie.c: New file (based on wsess.c).
* gen/conn_rate.c: File renamed from sess_rate.c.
* gen/call_seq.c: Modify to take advantage of reference counting.
* gen/Makefile (libgen.a): Remove uri_wsesslog (it's part of
wsesslog now).
* gen/uri_wsesslog.c: Remove.
* gen/uri_wsesslog.h: Ditto.
* event.h (Event_Type): New member EV_PERF_SAMPLE for performance
sampling (invoked once every 5 seconds). Rename EV_USER_NEW to
EV_SESS_NEW and EV_USER_DESTROYED to EV_SESS_DESTROYED. New
member EV_SESS_FAILED that is signalled when a session fails.
* core.c (do_send): Remove left-over assert()ion.
(do_send): Preserve io vector element that is being sent in
iov_saved. Call call_dec_ref() when the connection is closing.
(recv_done): Rename `c' to `call' and invoke call_dec_ref().
(do_recv): Call conn_failure() only if errno != EAGAIN (for Linux).
(core_send): Add `conn' argument. Fill in req.iov[IE_HOST] and
req.iov[IE_PROTL] only (rest has been filled in by call_set_* macros).
Call call_inc_ref() once the call is ready.
(core_close): Rename `s' to `conn'. Destroy pending calls calls
on the sendq and recvq by calling call_dec_ref(). Call conn_dec_ref()
at the end.
(core_loop): Obtain a reference to the connection object for the
duration of read & write processing.
* conn.h: Include <object.h>.
(MAX_HDR_LINE_LEN): New macro.
(struct Conn): Remove member first_owned and line_size. Replace
line_buf pointer with line_buf array.
(conn_init): Declare.
(conn_deinit): Ditto.
(conn_new): New macro.
(conn_inc_ref): Ditto.
(conn_dec_ref): Ditto.
* conn.c: Remove include of <errno.h> and <event.h>.
(conn_new): Remove.
(conn_destroy): Ditto.
(conn_init): New function.
(conn_deinit): Ditto.
* call.h: (enum HTTP_Method): Remove.
Include <object.h>.
(struct Call): Remove members loc_len, loc, uri_len, uri,
orig_host, extra_hdrs, contents_len, contents. New member:
iov_saved.
(call_init): Declare.
(call_deinit): Ditto.
(call_new): New macro.
(call_inc_ref): Ditto.
(call_dec_ref): Ditto.
(call_set_method): Ditto.
(call_set_location): Ditto.
(call_set_uri): Ditto.
(call_set_contents): Ditto.
* call.c (call_method_name): Remove.
(free_call_list): Remove.
(call_new): Remove.
(call_init): New function.
(call_deinit): Ditto.
(call_append_request_header): Fill req.iov[IE_FIRST_HEADER +
num_hdrs] instead of req.extra_hdrs[num_hdrs].
* Makefile (HTTPERF): Mention object and sess.
1998-05-29 David Mosberger <davidm@hpl.hp.com>
* Version 0.5 released.
* core.c (core_send): Fix setup of IE_METHOD and insert blank
character in IE_BLANK.
* call.h (enum IOV_Element): Add IE_BLANK.
1998-05-27 David Mosberger <davidm@hpl.hp.com>
* timer.c: Rename t_next to t_curr.
(timer_tick): Set t_next _after_ invoking the callback. This
allows the callback to cancel all other timers (except itself).
(timer_cancel): Add assertion to ensure that timer_cancel() is
not called from within the handler of a given timer.
* httperf.h (enum Dist_Type): New type.
(struct Rate_Info): Ditto.
(struct Cmdline_Params): Change type of RATE member from Time to
Rate_Info. New member WSESSLOG.
(panic): Declare.
* httperf.h (VERSION): Up version number to 0.5.
* httperf.c: Include <ctype.h> and <stdarg.h>. New options:
close-with-reset, period, wsesslog.
(usage): Add usage message for new options.
(panic): New function.
(main): Declare wsesslog, uri_wsesslog, and wsesslog_stat.
Initialize param.rate.dist with DETERMINISTIC. Handle --period
and --wsesslog options. Fix typo: user think time is 3rd, not 4th
parameter in wsess parameter list.
(main): Call timer_tick() after initializating the statistic
collectors and workload generators so our notion of the current
time is reasonably accurate.
* gen/wsess.c (req_create): Use call_append_request_header().
(start): Initialize rg_sess.rate with ¶m.rate.
* gen/uri_wsesslog.h: New file (by Dick Carter).
* gen/uri_wsesslog.c: Ditto.
* gen/wsesslog.h: Ditto.
* gen/wsesslog.c: Ditto.
* gen/uri_wlog.c: Drop inclusion of <stdarg.h>.
Move panic() from here to httperf.c.
* gen/sess_rate.c (start): Initialize rg.rate with ¶m.rate.
* gen/rate.h: New member next_interarrival_time. New member
xsubi. Replace PERIOD member with RATE member.
(rate_generator_stop): Drop second argument (RATE).
* gen/rate.c: Include <math.h>, <stdio.h>, and <stdlib.h>.
(next_arrival_time_det): New function.
(next_arrival_time_uniform): Ditto.
(next_arrival_time_exp): Ditto.
(tick): Invoke (*next_arrival_time)() to determine next delay.
(rate_generator_start): Initialize rg->xsubi based on
param.client.id. Initialize rg->next_interarrival_time based on
desired distribution.
* gen/Makefile (libgen.a): Mention wsesslog.o and uri_wsesslog.o
* core.c (core_connect): Don't rely on realloc(0, SIZE) doing the
right thing.
(core_connect): Clear newly allocated sd_to_conn elements after
allocating them.
(core_send): Use call_method_name. Copy in defined
c->req.extra_hdrs[i] iovecs. Copy in IE_CONTENT iovec.
* call.h: New value HM_LEN.
(MAX_EXTRA_HEADERS): New macro. Replace IE_HEADERS with
IE_FIRST_HEADER and IE_LAST_HEADER. Make extra_hdrs an array of
`struct iovec'. New member num_extra_hdrs.
(call_append_request_header): Declare new function.
* call.c: New array.
(call_append_request_header): New function.
1998-05-26 David Mosberger <davidm@hpl.hp.com>
* COPYRIGHT: Add 1998 as copyright year.
* stat/basic.c (dump): If no connections have been created, print
0.0 for minimm connection lifetime. This avoids a core-dump under
FreeBSD, which seems to have a problem printing IEEE infinity.
1998-05-22 David Mosberger <davidm@hpl.hp.com>
* call.c (method_name): New variable.
1998-04-27 David Mosberger <davidm@hpl.hp.com>
* core.c (do_recv): Ignore EAGAIN errors---Linux 2.0.32 sometimes
returns EAGAIN on a read() if a previous write() resulted in
EAGAIN.
* AUTHORS: New file.
1998-03-24 David Mosberger <davidm@hpl.hp.com>
* gen/wsess.c (call_done): Also fall back to non-persistent
session if c->req.version < HTTP/1.1.
1998-03-18 David Mosberger <davidm@hpl.hp.com>
* httperf.c (usage): Fix typo: --recv-buffer -> --send-buffer.
* gen/wsess.c (dump): Rename "Sess" to "Session" in statistics
output.
* core.c (core_connect): Turn on closing with RESET only when
param.close_with_reset is set.
1998-03-17 David Mosberger <davidm@hpl.hp.com>
* stat/basic.c (dump): In "Total" line, rename "call" to "req".
* Version 0.41 released.
* core.c: Include <sys/resource.h> after <sys/types.h> to get it
to compile under FreeBSD (which seems to have a broken libc).
* stat/basic.c (dump): Complete renaming of "session" to "call".
Rename "Call" to "Request".
1998-03-16 David Mosberger <davidm@hpl.hp.com>
* Version 0.4 released.
* httperf.h (VERSION): Change version number to 0.4.
* httperf.c: (longopts): Add --http-version.
(main): Initialize param.http_version to HTTP/1. Support parsing
of --http-version option. Echo --http-version option if version
other than 1.1 is selected.
* httperf.h (struct Cmdline_Params): New member HTTP_VERSION.
* core.c (core_send): Support generation of HTTP/1.0 requests.
* Patches by Stephane Eranian:
* httperf.man: Mention --wlog parameter.
* Makefile (clean): Use $(MAKE) instead of make.
1998-03-12 David Mosberger <davidm@hpl.hp.com>
* httperf.c: Renamed Session to Conn to avoid confusion between
user sessions and TCP connections.
1998-03-02 David Mosberger <davidm@hpl.hp.com>
* gen/wsess.c (user_destroy): Signal EV_USER_DESTROYED.
(user_create): Signal EV_USER_NEW.
(start): Register rate-generator with event EV_USER_DESTROYED
instead of EV_SESSION_DESTROYED.
* event.h: New events EV_USER_NEW and EV_USER_DESTROYED.
* event.c: Ditto.
1998-02-27 David Mosberger <davidm@hpl.hp.com>
* session.h: Remove unused first_call member.
1998-02-26 David Mosberger <davidm@hpl.hp.com>
* gen/wsess.c (call_recv_hdr): Always check for Connection: and
Set-Cookie: headers (not just for first call).
(req_create): Modify to support bursts.
(user_connect): Ditto.
(sess_destroyed): Ditto.
(call_destroyed): Ditto.
1998-02-25 David Mosberger <davidm@hpl.hp.com>
* core.c (lffs): Fix lffs() so it returns 0 when no bits at all
are set in a 64 bit long.
(set_active): Set recvq timeout if timeout==0.0 (the old code failed
to timeout connections that were waiting for replies).
1998-02-23 David Mosberger <davidm@hpl.hp.com>
* Version 0.3 released.
* timer.c (timer_now_forced): New function.
* httperf.h (Cmdline_params): New member burst_len.
* httperf.c: New option --burst-length. At present, only
gen/call_seq.c supports this (gen/wsess does not).
* gen/wsess.c (struct User): New members: found_close_hdr,
conn_start, call_start, and cookie.
(req_create): Insert cookie as extra header if there is one.
(call_recv_hdr): New function. Looks for "Connection: close" and
"Set-Cookie:" headers.
* gen/call_seq.c (Sess_Private_Data): New member "num_finished".
(issue_calls): Add support for --burst-len parameter.
(call_destroyed): Ditto.
* core.c (SYSCALL): Call timer_now_forced() instead of timer_now().
(core_connect): Keep track of longest back-to-back burst.
(core_connect): Set SO_LINGER option so that TCP RST is sent when
closing the socket. This avoids the client melting down on
HP-UX 10.20 due to a large number of TCP connections in TIME_WAIT
state (HP-UX is broken as far as bind()/connect() is concerned when
there are many TCP control blocks).
(core_exit): Print maximum connect burst length.
* core.c (max_burst_len): New variable to keep track of longest
back-to-back burst generated (large bursts are usually a sign of
the client being overloaded).
1998-02-13 David Mosberger <davidm@hpl.hp.com>
* stat/basic.c (sess_fail): Print one unexpected error number per
execution, independent of DBG.
1998-02-06 David Mosberger <davidm@hpl.hp.com>
* core.c (do_send): Maintain sendq_tail & recvq_tail.
(core_send): Ditto.
(recv_done): Ditto.
* session.h (Session): New members SENDQ_TAIL and RECVQ_TAIL.
* core.c (set_active): Set watchdog timer to the minimum of the
timeout of the request being sent and that being received (if such
requests exist).
(do_send): Set c->timeout.
(core_connect): Ditto.
(core_send): Ditto.
* call.h: Replace (unused) WATCHDOG member with TIMEOUT.
* timer.c (timer_schedule): Handle negative delays gracefully.
1998-01-28 David Mosberger <davidm@hpl.hp.com>
* Version 0.2 released to SixFlags team.
1998-01-26 David Mosberger <davidm@hpl.hp.com>
* gen/call_seq.c (sess_closed): New function.
(init): Register sess_closed() so we notice when session closes
prematurely.
1998-01-21 David Mosberger <davidm@hpl.hp.com>
* httperf.c (main): Don't quit after printing version
information---it's useful to run a test and have this info as
well.
1998-01-14 David Mosberger <davidm@hpl.hp.com>
* stat/basic.c (dump): Add num_sock_reset to total error count.
1998-01-12 David Mosberger <davidm@hpl.hp.com>
* stat/basic.c (struct basic): New member num_sock_reset.
(sess_fail): Increment num_sock_reset for ECONNRESET.
(dump): Print num_sock_reset.
* core.c (do_recv): Call session_failure() when reading < 0 bytes.
* stat/basic.c (sess_fail): Print error number when getting an
unexpected errno and DBG > 0.
1998-01-09 David Mosberger <davidm@hpl.hp.com>
* httperf.c (main): Print only one newline (second newline is
printed by stat collectors).
* stat/basic.c (dump): Print session lifetime histogram first
(so it goes right after the rate output).
1998-01-08 David Mosberger <davidm@hpl.hp.com>
* core.c (port_get): Recode so port numbers are returned in
strictly increasing order (until a wraparound after 65535 occurs).
This avoids problems with NT 4.0 which disallows reusing the port
pair of a properly shut down TCP connection (which creates
problems when testing an NT server with clients running on HP-UX
or similar platforms).
1998-01-07 David Mosberger <davidm@hpl.hp.com>
* gen/sess_rate.c: Adapt to use rate.c.
* timer.c (timer_schedule): Adjust "delay" if realtime has grown
bigger than next_tick (meaning that "spoke" is behind).
* call.c (call_destroy): prev wasn't updated in the search loop.
1998-01-06 David Mosberger <davidm@hpl.hp.com>
* stat/basic.c (dump): Print minmum rate as zero if there are no
rate samples.
1997-12-23 David Mosberger <davidm@hpl.hp.com>
* stat/basic.c (struct basic): Add members num_reply_rates,
reply_rate_sum, reply_rate_sum2, reply_rate_min, and
reply_rate_max.
(interval_start, num_replies): New vars.
(sample_rate): New function to sample reply rate.
(init): Schedule rate sampler.
(dump): Print min, avg, max, and stddev of sampled reply rate.
* httperf.c: Add --client and --think-timeout options.
1997-12-17 David Mosberger <davidm@hpl.hp.com>
* http.c (parse_data): Return TRUE to indicate that all bytes
(of present chunk) have been received (instead of setting
state to S_REPLY_DONE).
* httperf.h (ALIGN): Fix macro (need AND with _complement_...).
* http.c (xfer_chunked): Fix typo: check for content_bytes >=
content_length (not vice versa).
* uri_wset.c (set_uri): Fix uri_len computation.
* sess_rate.c (destroyed): Fix typo: test for param.rate <= 0 (not
<0).
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/Makefile
================================================
# Generated automatically from Makefile.in by configure.
SHELL=/bin/sh
srcdir = .
top_srcdir = .
top_builddir = .
prefix = /usr/local
bindir = ${exec_prefix}/bin
mandir = ${prefix}/man
SUBDIRS = lib gen stat
CC = gcc
RANLIB = ranlib
MKDIR = $(top_srcdir)/mkinstalldirs
INSTALL = /usr/bin/install -c
INSTALL_PROGRAM = ${INSTALL}
INSTALL_DATA = ${INSTALL} -m 644
# INCLUDES = -I$(top_srcdir)/include -I$(top_builddir) -I$(top_srcdir) -I$(top_srcdir)/lib
INCLUDES = -I$(top_srcdir)/include -I$(top_builddir) -I$(top_srcdir) -I$(top_srcdir)/lib -I/usr/kerberos/include
DEFS = -DHAVE_CONFIG_H
CPPFLAGS = -DNDEBUG -D_GNU_SOURCE -D_XOPEN_SOURCE
CFLAGS = -g -O2 -Wall
LDFLAGS =
LIBS = -lssl -lcrypto -lm
ifeq (x86_64, ia64)
CPPFLAGS += -DIA64
endif
# Uncomment this to keep track of time spent in system calls
#DEFS += -DTIME_SYSCALLS
# Uncomment this to have httperf wait nicely when doing a select()
DEFS += -DDONT_POLL
# Uncomment this to enable --use-cpu-mask functionality (requires OS support)
DEFS += -DHAVE_SCHED_AFFINITY -DHAVE_EPOLL
# Uncomment this to enable tracking statistics about each call (request)
DEFS += -DUW_CALL_STATS
# Uncomment this to enable session log file specified dynamic timeouts
DEFS += -DUW_DYNOUT
# Uncomment this to enable statistics that ignore specified ramp up and ramp down periods
#DEFS += -DUW_STABLE_STATS
CPPFLAGS += -DBIG_FD_SETSIZE
# Uncomment this if you want to enable
# --idle-connections N which starts an idleconn process
# on the same machine. Can be used with trun's IDLERATE and IDLECONN.
#CPPFLAGS += -DIDLECONN
COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
LINK = $(CC) $(LDFLAGS) -o $@
.c.o:
$(COMPILE) $<
HTTPERF_OBJS = httperf.o object.o call.o conn.o sess.o core.o event.o \
http.o timer.o sys_sched_affinity.o
TTEST_OBJS = ttest.o timer.o
all: all-recursive httperf idleconn
httperf: $(HTTPERF_OBJS) gen/libgen.a stat/libstat.a lib/libutil.a
$(LINK) $(HTTPERF_OBJS) \
gen/libgen.a stat/libstat.a lib/libutil.a $(LIBS)
idleconn: idleconn.o
$(LINK) idleconn.o $(LIBS)
install: install-recursive httperf
$(MKDIR) $(bindir) $(mandir)/man1
$(INSTALL_PROGRAM) httperf $(bindir)/httperf
$(INSTALL_DATA) $(srcdir)/httperf.man $(mandir)/man1/httperf.1
ttest: ttest.o timer.o
clean: clean-recursive
rm -f $(HTTPERF_OBJS) $(TTEST_OBJS) idleconn.o httperf idleconn ttest
distclean: distclean-recursive
rm -f *~
all-recursive install-recursive clean-recursive distclean-recursive \
depend-recursive:
@for subdir in $(SUBDIRS); do \
target=`echo $@ | sed s/-recursive//`; \
echo making $$target in $$subdir; \
(cd $$subdir && $(MAKE) $$target) \
|| case "$(MFLAGS)" in *k*) fail=yes;; *) exit 1;; esac; \
done && test -z "$$fail"
.PHONY: all install clean distclean depend \
all-recursive install-recursive clean-recursive distclean-recursive \
depend-recursive
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/Makefile.in
================================================
SHELL=/bin/sh
VPATH = @srcdir@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
top_builddir = .
prefix = @prefix@
bindir = @bindir@
mandir = @mandir@
SUBDIRS = lib gen stat
CC = @CC@
RANLIB = @RANLIB@
MKDIR = $(top_srcdir)/mkinstalldirs
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
# INCLUDES = -I$(top_srcdir)/include -I$(top_builddir) -I$(top_srcdir) -I$(top_srcdir)/lib
INCLUDES = -I$(top_srcdir)/include -I$(top_builddir) -I$(top_srcdir) -I$(top_srcdir)/lib -I/usr/kerberos/include
DEFS = @DEFS@
CPPFLAGS = @CPPFLAGS@
CFLAGS = @CFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
ifeq (@target_cpu@, ia64)
CPPFLAGS += -DIA64
endif
# Uncomment this to keep track of time spent in system calls
#DEFS += -DTIME_SYSCALLS
# Uncomment this to have httperf wait nicely when doing a select()
DEFS += -DDONT_POLL
# Uncomment this to enable --use-cpu-mask functionality (requires OS support)
DEFS += -DHAVE_SCHED_AFFINITY -DHAVE_EPOLL
# Uncomment this to enable tracking statistics about each call (request)
DEFS += -DUW_CALL_STATS
# Uncomment this to enable session log file specified dynamic timeouts
DEFS += -DUW_DYNOUT
# Uncomment this to enable statistics that ignore specified ramp up and ramp down periods
#DEFS += -DUW_STABLE_STATS
CPPFLAGS += -DBIG_FD_SETSIZE
# Uncomment this if you want to enable
# --idle-connections N which starts an idleconn process
# on the same machine. Can be used with trun's IDLERATE and IDLECONN.
#CPPFLAGS += -DIDLECONN
COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
LINK = $(CC) $(LDFLAGS) -o $@
@SET_MAKE@
.c.o:
$(COMPILE) $<
HTTPERF_OBJS = httperf.o object.o call.o conn.o sess.o core.o event.o \
http.o timer.o sys_sched_affinity.o
TTEST_OBJS = ttest.o timer.o
all: all-recursive httperf idleconn
httperf: $(HTTPERF_OBJS) gen/libgen.a stat/libstat.a lib/libutil.a
$(LINK) $(HTTPERF_OBJS) \
gen/libgen.a stat/libstat.a lib/libutil.a $(LIBS)
idleconn: idleconn.o
$(LINK) idleconn.o $(LIBS)
install: install-recursive httperf
$(MKDIR) $(bindir) $(mandir)/man1
$(INSTALL_PROGRAM) httperf $(bindir)/httperf
$(INSTALL_DATA) $(srcdir)/httperf.man $(mandir)/man1/httperf.1
ttest: ttest.o timer.o
clean: clean-recursive
rm -f $(HTTPERF_OBJS) $(TTEST_OBJS) idleconn.o httperf idleconn ttest
distclean: distclean-recursive
rm -f *~
all-recursive install-recursive clean-recursive distclean-recursive \
depend-recursive:
@for subdir in $(SUBDIRS); do \
target=`echo $@ | sed s/-recursive//`; \
echo making $$target in $$subdir; \
(cd $$subdir && $(MAKE) $$target) \
|| case "$(MFLAGS)" in *k*) fail=yes;; *) exit 1;; esac; \
done && test -z "$$fail"
.PHONY: all install clean distclean depend \
all-recursive install-recursive clean-recursive distclean-recursive \
depend-recursive
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/NEWS
================================================
-*-Mode: outline-*-
* New in version 0.8:
** httperf is now released under the GNU General Public License (GPL).
** Preliminary support for SSL (Secure Socket Layer). See README for details.
** New options (see man-page for details):
--print-reply (replaced --print-replies)
--print-request
--ssl
--ssl-ciphers
--ssl-no-reuse
* New in version 0.7:
** New options (see man-page for details):
--add-header
--method
--retry-on-failure
** Bug fixes
- fixed some segfaults in the session workload generator
- specifying option --session-cookie when not using a session
workload generator now prints an error message instead of
core dumping
* New in version 0.6:
** New options (see man-page for details):
--max-connections
--max-piped-calls
--print-replies
--session-cookies
** Cookie support now must be requested explicitly when using a session-based
workload generator. To do this, specify option --session-cookie.
* New in version 0.5:
** Normal connection closing is the default again. To request closing TCP
connections with a RESET, specify option --close-with-reset.
** --wsesslog option added to support log-file based session
specification (contributed by Dick Carter).
** --period option added to allow a more flexible way to specify
session/connection interarrival time. Unlike the --rate
argument, this allows deterministic (fixed), uniform, and
exponentially distributed interarrival times (contributed by Dick
Carter).
** Various bug fixes (see ChangeLog for details).
* New in version 0.41:
** In basic statistic, rename "call" to "request".
* New in version 0.4:
** Option --http-version can be used to select the HTTP protocol version
used in sending requests. 1.0 and 1.0 are the only allowed values
for this option at this point.
** What used to be called a "session" is now called a "connection". This
reduces confusion between TCP connections and user sessions.
** Stephane's log-file based URL generated has been added.
** The session workload generator now supports the --burst-length
parameter to generate bursty session.
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/README
================================================
-*-Mode: outline-*-
* Building httperf
This release of httperf is using the standard GNU configuration
mechanism. The following steps can be used to build it:
$ mkdir build
$ cd build
$ SRCDIR/configure
$ make
$ make install
In this example, SRCDIR refers to the httperf source directory. The
last step may have to be executed as "root".
To build httperf with debug support turned on, invoke configure with
option "--enable-debug".
By default, the httperf binary is installed in /usr/local/bin/httperf
and the man-page is installed in /usr/local/man/man1/httperf. You can
change these defaults by passing appropriate options to the
"configure" script. See "configure --help" for details.
This release of httperf has preliminary SSL support. To enable it,
you need to have OpenSSL (http://www.openssl.org/) already installed
on your system. The configure script assumes that the OpenSSH header
files and libraries can be found in standard locations (e.g.,
/usr/include and /usr/lib). If the files are in a different place,
you need to tell the configure script where to find them. This can be
done by setting environment variables CPPFLAGS and LDFLAGS before
invoking "configure". For example, if the SSL header files are
installed in /usr/local/ssl/include and the SSL libraries are
installed in /usr/local/ssl/lib, then the environment variables should
be set like this:
CPPFLAGS="-I/usr/local/ssl/include"
LDFLAGS="-L/usr/local/ssl/lib"
With these settings in place, "configure" can be invoked as usual and
SSL should now be found. If SSL has been detected, the following
three checks should be answered with "yes":
checking for main in -lcrypto... yes
checking for SSL_version in -lssl... yes
:
checking for openssl/ssl.h... yes
Note: you may have to delete "config.cache" to ensure that "configure"
re-evaluates those checks after changing the settings of the
environment variables.
WARNING:
httperf uses a deterministic seed for the random number
generator used by SSL. Thus, the SSL encrypted data is
likely to be easy to crack. In other words, do not assume
that SSL data transferred when using httperf is (well)
encrypted!
This release of httperf has been tested under HP-UX 10.20 and 11.0,
various versions of Red Hat Linux, both on the x86 and IA-64
architectures. It should be straight-forward to build httperf on
other platforms, but your mileage may vary.
* Mailing list
A mailing list has been set up to encourage discussions among the
httperf user community. This list is managed by majordomo. To
subscribe to the list, send a mail containing the body:
subscribe httperf
to majordomo@linux.hpl.hp.com. To post an article to the list, send
it directly to httperf@linux.hpl.hp.com.
* Running httperf
IMPORTANT: It is crucial to run just one copy of httperf per client
machine. httperf sucks up all available CPU time on a machine. It is
therefore important not to run any other (CPU-intensive) tasks on a
client machine while httperf is running. httperf is a CPU hog to
ensure that it can generate the desired workload with good accuracy,
so do not try to change this without fully understanding what the
issues are.
** Examples
The simplest way to invoke httperf is with a command line of the form:
httperf --server wailua --port 6800
This command results in httperf attempting to make one request for URL
http://wailua:6800/. After the reply is received, performance
statistics will be printed and the client exits (the statistics are
explained below).
A list of all available options can be obtained by specifying the
--help option (all option names can be abbreviated as long as they
remain unambiguous).
A more realistic test case might be to issue 1000 HTTP requests at a
rate of 10 requests per second. This can be achieved by additionally
specifying the --num-conns and --rate options. When specifying the
--rate option, it's generally a good idea to also specify a timeout
value using the --timeout option. In the example below, a timeout of
one second is specified (the ramification of this option will be
explained later):
httperf --server wailua --port 6800 --num-conns 100 --rate 10 --timeout 1
The performance statistics printed by httperf at the end of the test
might look like this:
Total: connections 100 requests 100 replies 100 test-duration 9.905 s
Connection rate: 10.1 conn/s (99.1 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 4.6 avg 5.6 max 19.9 median 4.5 stddev 2.0
Connection time [ms]: connect 1.4
Connection length [replies/conn]: 1.000
Request rate: 10.1 req/s (99.1 ms/req)
Request size [B]: 57.0
Reply rate [replies/s]: min 10.0 avg 10.0 max 10.0 stddev 0.0 (1 samples)
Reply time [ms]: response 4.1 transfer 0.0
Reply size [B]: header 219.0 content 204.0 footer 0.0 (total 423.0)
Reply status: 1xx=0 2xx=100 3xx=0 4xx=0 5xx=0
CPU time [s]: user 2.71 system 7.08 (user 27.4% system 71.5% total 98.8%)
Net I/O: 4.7 KB/s (0.0*10^6 bps)
Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
There are six groups of statistics: overall results ("Total"),
connection related results ("Connection"), results relating to the
issuing of HTTP requests ("Request"), results relating to the replies
received from the server ("Reply"), miscellaneous results relating to
the CPU time and network bandwidth used, and, finally, a summary of
errors encountered ("Errors"). Let's discuss each in turn:
** "Total" Results
The "Total" line summarizes how many TCP connections were initiated by
the client, how many requests it sent, how many replies it received,
and what the total test duration was. The line below shows that 100
connections were initiated, 100 requests were performed and 100
replies were received. It also shows that total test-duration was
9.905 seconds meaning that the average request rate was almost exactly
10 request per second.
Total: connections 100 requests 100 replies 100 test-duration 9.905 s
** "Connection" Results
These results convey information related to the TCP connections that
are used to communicate with the web server.
Specifically, the line below show that new connections were initiated
at a rate of 10.1 connections per second. This rate corresponds to a
period of 99.1 milliseconds per connection. Finally, the last number
shows that at most one connection was open to the server at any given
time.
Connection rate: 10.1 conn/s (99.1 ms/conn, <=1 concurrent connections)
The next line in the output gives lifetime statistics for successful
connections. The lifetime of a connection is the time between a TCP
connection was initiated and the time the connection was closed. A
connection is considered successful if it had at least one request
that resulted in a reply from the server. The line shown below
indicates that the minimum ("min") connection lifetime was 4.6
milliseconds, the average ("avg") lifetime was 5.6 milliseconds, the
maximum ("max") was 19.9 milliseconds, the median ("median") lifetime
was 4.5 milliseconds, and that the standard deviation of the lifetimes
was 2.0 milliseconds.
Connection time [ms]: min 4.6 avg 5.6 max 19.9 median 4.5 stddev 2.0
To compute the median time, httperf collects a histogram of connection
lifetimes. The granularity of this histogram is currently 1
milliseconds and the maximum connection lifetime that can be
accommodated with the histogram is 100 seconds (these numbers can be
changed by editing macros BIN_WIDTH and MAX_LIFETIME in stat/basic.c).
This implies that the granularity of the median time is 1 millisecond
and that at least 50% of the lifetime samples must have a lifetime of
less than 100 seconds.
The next statistic in this section is the average time it took to
establish a TCP connection to the server (all successful TCP
connections establishments are counted, even connections that may have
failed eventually). The line below shows that, on average, it took
1.4 milliseconds to establish a connection.
Connection time [ms]: connect 1.4
The final line in this section gives the average number of replies
that were received per connection. With regular HTTP/1.0, this value
is at most 1.0 (when there are no failures), but with HTTP Keep-Alives
or HTTP/1.1 persistent connections, this value can be arbitrarily
high, indicating that the same connection was used to receive multiple
responses.
Connection length [replies/conn]: 1.000
** "Request" Results
The first line in the "Request"-related results give the rate at which
HTTP requests were issued and the period-length that the rate
corresponds to. In the example below, the request rate was 10.1
requests per second, which corresponds to 99.1 milliseconds per
request.
Request rate: 10.1 req/s (99.1 ms/req)
As long as no persistent connections are employed, the "Request"
results are typically very similar or identical to the "Connection"
results. However, when persistent connections are used, several
requests can be issued on a single connection in which case the
results would be different.
The next line gives the average size of the HTTP request in bytes. In
the line show below, the average request size was 57 bytes.
Request size [B]: 57.0
** "Reply" Results
For simple measurements, the section with the "Reply" results is
probably the most interesting one. The first line gives statistics on
the reply rate:
Reply rate [replies/s]: min 10.0 avg 10.0 max 10.0 stddev 0.0 (1 samples)
The line above indicates that the minimum ("min"), average ("avg"),
and maximum ("max") reply rate was ten replies per second. Given
these numbers, the standard deviation is, of course, zero. The last
number shows that only one reply rate sample was acquired. The
present version of httperf collects one rate sample about once every
five seconds. To obtain a meaningful standard deviation, it is
recommended to run each test long enough so at least thirty samples
are obtained---this would correspond to a test duration of at least
150 seconds, or two and a half minutes.
The next line gives information on how long it took for the server to
respond and how long it took to receive the reply. The line below
shows that it took 4.1 milliseconds between sending the first byte of
the request and receiving the first byte of the reply. The time to
"transfer", or read, the reply was too short to be measured, so it
shows up as zero (as we'll see below, the entire reply fit into a
single TCP segment and that's why the transfer time was measured as
zero).
Reply time [ms]: response 4.1 transfer 0.0
Next follow some statistics on the size of the reply---all numbers are
reported in bytes. Specifically, the average length of reply headers,
the average length of the content, and the average length of reply
footers are given (HTTP/1.1 uses footers to realize the "chunked"
transfer encoding). For convenience, the average total number of
bytes in the replies is also given. In the example below, the average
header length ("header") was 219 bytes, the average content length
("content") was 204 bytes, and there were no footers ("footer"),
yielding a total reply length of 423 bytes on average.
Reply size [B]: header 219.0 content 204.0 footer 0.0 (total 423.0)
The final piece in this section is a histogram on the status codes
received in the replies. The example below shows that all 100 replies
were "successful" replies as they contained a status code of 200
(presumably):
Reply status: 1xx=0 2xx=100 3xx=0 4xx=0 5xx=0
** Miscellaneous Results
This section starts with a summary of the CPU time the client
consumed. The line below shows that 2.71 seconds were spent executing
in user mode ("user"), 7.08 seconds were spent executing in system
mode ("system") and that this corresponds to 27.4% user mode execution
and 71.5% system execution. The total utilization was almost exactly
100%, which is expected given that httperf is a CPU hog:
CPU time [s]: user 2.71 system 7.08 (user 27.4% system 71.5% total 98.8%)
Note that any time the total CPU utilization is significantly less
than 100%, some other processes must have been running on the client
machine while httperf was executing. This makes it likely that the
results are "polluted" and the test should be rerun.
The next line gives the average network throughput in kilobytes per
second (where a kilobyte is 1024 bytes) and in megabits per second
(where a megabit is 10^6 bit). The line below shows an average
network bandwidth of about 4.7 kilobyte per second. The megabit per
second number is zero due to rounding errors.
Net I/O: 4.7 KB/s (0.0*10^6 bps)
The network bandwidth is computed from the number of bytes sent and
received on TCP connections. This means that it accounts for the
network payload only (i.e., it doesn't account for protocol headers)
and does not take into account retransmissions that may occur at the
TCP level.
** "Errors"
The final section contains statistics on the errors that occurred
during the test. The "total" figure shows the total number of errors
that occurred. The two lines below show that in our example run there
were no errors:
Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
The meaning of each error is described below:
total:
The sum of all following error counts.
client-timo:
Each time a request is made to the server, a watchdog timer
is started. If no (partial) response is received by the time
the watchdog timer expires, httperf times out that request
a increments this error counter. This is the most common error
when driving a server into overload.
socket-timo
The number of times a TCP connection failed with a
socket-level time out (ETIMEDOUT).
connrefused
The number of times a TCP connection attempt failed with
a "connection refused by server" error (ECONNREFUSED).
connreset
The number of times a TCP connection failed due to a reset
(close) by the server.
fd-unavail
The number of times the httperf client was out of file
descriptors. Whenever this count is bigger than
zero, the test results are meaning less because the client
was overloaded (see discussion on setting --timeout below).
addrunavail
The number of times the client was out of TCP port numbers
(EADDRNOTAVAIL). This error should never occur. If it
does, the results should be discarded.
ftab-full
The number of times the system's file descriptor table
was full. Again, this error should never occur. If it
does, the results should be discarded.
other
The number of times other errors occurred. Whenever this
occurs, it is necessary to track down the actual error
reason. This can be done by compiling httperf with
debug support and specifying option --debug 1.
** Selecting appropriate timeout values
Since the client machine has only a limited set of resource available,
it cannot sustain arbitrarily high HTTP request rates. One limit is
that there are only roughly 60,000 TCP port numbers that can be in use
at any given time. Since, on HP-UX, it takes one minute for a TCP
connection to be fully closed (leave the TIME_WAIT state), the maximum
rate a client can sustain is about 1,000 requests per second.
The actual sustainable rate is typically lower than this because
before running out of TCP ports, a client is likely to run out of file
descriptors (one file descriptor is required per open TCP connection).
By default, HP-UX 10.20 allows 1024 file descriptors per process.
Without a watchdog timer, httperf could potentially quickly use up all
available file descriptors, at which point it could not induce any new
load on the server (this would primarily happen when the server is
overloaded). To avoid this problem, httperf requires that the web
server must respond within the time specified by option --timeout. If
it does not respond within that time, the client considers the
connection to be "dead" and closes it (and increases the "client-timo"
error count). The only exception to this rule is that after sending a
request, httperf allows the server to take some additional time before
it starts responding (to accommodate HTTP requests that take a long
time to complete on the server). This additional time is called the
"server think time" and can be specified by option --think-timeout.
By default, this additional think time is zero, so by default the
server has to be able to respond within the time allowed by the
--timeout option.
In practice, we found that with a --timeout value of 1 second, an HP
9000/735 machine running HP-UX 10.20 can sustain a rate of about 700
connections per second before it starts to run out of file descriptor
(the exact rate depends, of course, on a number of factors). To
achieve web server loads bigger than that, it is necessary to employ
several independent machines, each running one copy of httperf. A
timeout of one second effectively means that "slow" connections will
typically timeout before TCP even gets a chance to retransmit (the
initial retransmission timeout is on the order of 3 seconds). This is
usually OK, except that one should keep in mind that it has the effect
of truncating the connection life time distribution.
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/README.UW/README.CALL_STATS
================================================
OVERVIEW
--------
call_stats is a statistics module in httperf. The purpose of this
module is to gather statistics on a per call basis. The statistics
reported by the call_stats module can either be filled into a
pre-sized buffer or displayed on the fly as the requests are completed.
Using a buffer is the recommended means of gathering statistics, due
to the reduced overhead during execution.
Currently, call_stats can only be used when the workload is generated
by the --wsesslog or --uri parameter. Using call_stats in combination
with any other workload generation method will produce unknown
results. Additionaly, call_stats can not be used in combination with a
--wsesslog specifies workload containing bursts.
The statistics gathered by the call_stats module are as follows:
(1) call number
-internal unique identifier
-sent as HTTP header to server so that they can be paired
(2) connection number
-internal unique identifier
-sent as HTTP header to server so that they can be paired
(3) request size
-measured in bytes
(4) response size
-measured in bytes
(5) percentage received
(6) byte rate
-[ (4) / (8) ] * 8 / 1000000
(7) connection time
-measured in seconds
-if multiple requests are sent, the first request records the
connection time
(8) response time
-measured in seconds
-measured from when the request it sent, to when the last byte
is received
(9) total time
-measured in seconds
(10) HTTP status
-if the status has been received it will be reported, even if
the request times out before all of the data is received
(11) time limit
-measured in seconds
(12) timed out
-no => request completed successfully
-yes-NC => the request timed out before the connection was
established
-yes-C => the request timed out after the connection was
established
(13) file requested
-uri requested
Some of the statistics reported by the call_stats module rely on
knowing the size of the file being requested. If call_stats is used in
combination with the --wsesslog parameter, the file sizes are
specified in the input log file. If call_stats is used in combination
with the --uri parameter, then the --call-stats-file parameter must
also be used.
IMPLEMENTATION DETAILS
----------------------
There are three points where call_stats gathers information:
-when a request is sent
-when a request receives the last byte of data
-when a connection times out
When any of these events occur, the appropriate call_stats function is
triggered.
If the call_stats module is used with a pre-set buffer, then all of the
statistics gathered throughout the execution period are displayed
after all of the requests have completed. If the call_stats module is
not used with the pre-set buffer then each request's statistics are
displayed once it has completed, either by receiving its last byte or
by timing out.
When a requests completes successfully, all of the statistics are
filled in. However, if a request times out, it will only report those
statistics that are relevant, depending on what point it timed out at.
The challenge comes when a request is scheduled by the workload
generator, but never actually gets created. This can occur under the
following circumstances:
-a request times out before the connection is established
-a request times out before all of the requests in a connection
are sent
In these cases, the call_stats module insures that the unique
identifiers for these calls do not get used by other calls, so
that it is able to report which calls did not happen. These entries
only report statistics (1)-(3), and (11)-(13).
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/README.UW/README.DYNOUT
================================================
The DYNOUT feature allows the timeout to be set separately for
each request.
It is set by adding a timeout specification after the request filename
in the log file, like this example that sets a 10 second timeout:
/affinity_set_small4/512KB-54694.txt timeout=10
The normal timeout, specified on the command line, applies to all
requests (or maybe sessions). The global value set on the command
line will be used if a individual timeout is not set for a request.
Code changes required for this feature can be enabled by defining
DYNOUT. It is implemented by adding an extra field to the request
data structure to record any timeout specific to that request. It
requires changes to gen/wsesslog.c to parse and record the timeout
values from the wsesslog file. It requires changes to stat/call_stats.c,
call.c, and core.c to use the individual timeouts rather than the
global session timeout.
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/README.UW/README.NO_RATE_HANG
================================================
The Problem:
1)a connection times out
2)core.c conn_timeout is called by the timer
3)this function signals the EV_CONN_TIMEOUT
4)gen/session conn_timeout is triggered
5)this function calls sess.c sess_failure
6)this function decrements the session object counter
7)there are not longer any ref's for the session
8)this causes event EV_SESS_DESTROYED
9)gen/session sess_destroyed is triggered
10)during clean up of the session it notices the conn
11)the function "helps" by calling core_close on the conn
12)A new connection is created in the place of the old one (httperf recycles space)
13)now return to core.c conn_timeout
14)call core_close on the conn, notice that this is the new connection
15)core_close destroys both the timer and frees the socket
16)left sitting waiting for an event that will never happen
Sample:
stszepes@scsltxxx:~/httperf-timout/build$ ./httperf --port=6800 --wsesslog=3,0,test5.log --call-stats=3 --timeout=0.0001 --print-request --print-reply --client=3/4
httperf: Collecting call stats buffer size = 3
httperf --print-reply --print-request --timeout=0.0001 --client=3/4 --server=localhost --port=6800 --uri=/ --send-buffer=4096 --recv-buffer=16384 --call-stats=3 --call-stats-file= --wsesslog=3,0.000,test5.log
Run on hostname: scsltxxx
Run at: Tue Jun 15 16:08:54 2010
Effective CPU mask: 0x3
hash_enter: localhost 6800
stat basic init: using maximum errno = 500
httperf main perf_sample timer_schedule
timer_SCHEDULE called, delay = 5.000000
conn id = 0, core_connect interested_in_writing
conn id = 0, interested_in_writing
conn id = 0, core_connect timer_schedule
timer_SCHEDULE called, delay = 0.000100
conn id = 0, core_loop_handle_socket timer_cancel
timer_CANCEL called
conn id = 0, core_send interested_in_writing
conn id = 0, interested_in_writing
conn id = 0, schedule_timeouts timer_schedule
timer_SCHEDULE called, delay = 0.000100
conn id = 0, core_loop_handle_socket timer_cancel
timer_CANCEL called
SH0:GET /docs/1B.txt HTTP/1.1
SH0:User-Agent: httperf/0.8.4
SH0:Host: localhost
SH0:Client-Id: 3 0
SH0:
SS0: header 89 content 0
conn id = 0, do_send interested_in_reading
conn id = 0, interested_in_reading
conn id = 0, schedule_timeouts timer_schedule
timer_SCHEDULE called, delay = 0.000100
conn id = 0, conn_timeout *******timeout occurs*******
x value = 0
conn id = 0, conn_timeout EV_CONN_TIMEOUT
x value = 0, timed_out = 0
conn id = 0, sess_destroyed core_close *******sess_destroyed being "helpfull"*******
conn id = 0, core_close...
conn id = 0, core_close executing...
conn id = 1, core_connect interested_in_writing *******new connection created*******
conn id = 1, interested_in_writing
conn id = 1, core_connect timer_schedule
timer_SCHEDULE called, delay = 0.000100
conn id = 1, conn_timeout core_close
x value = 0, timed_out = 0 *******closing the new connection(cont. on next line)*******
conn id = 1, core_close... *******x value should match the conn id and timed_out should be 1 if this was the correct conn*******
conn id = 1, core_close executing...
conn id = 1, core_close timer_cancel
timer_CANCEL called *******now the timer and the listening conn are gone*******
perf_sample timer_schedule
timer_SCHEDULE called, delay = 5.000000
perf_sample timer_schedule
timer_SCHEDULE called, delay = 5.000000
perf_sample timer_schedule
timer_SCHEDULE called, delay = 5.000000
... *******this will continue untill interupted*******
Maximum connect burst length: 1
Total: connections 2 requests 1 replies 0 test-duration 15.651 s
Number of connected connections is currently = 0
Connection rate: 0.1 conn/s (7825.5 ms/conn, <=1 concurrent connections)
Connected connection rate: 0.1 conn/s (7825.5 ms/conn, <=1 concurrent connected connections)
Connection time [ms]: min 0.0 avg 0.0 max 0.0 median 0.0 stddev 0.0
Connection time [ms]: connect 0.2
Connection length [replies/conn]: 0.000
Response time (no timeouts) [ms]: nan
Response time (only timeouts) [ms]: inf
Response time (all) [ms]: inf
Request rate: 0.1 req/s (15651.0 ms/req)
Request size [B]: 89.0
Overall reply rate: 0.0 replies/sec
Reply rate [replies/s]: min 0.0 avg 0.0 max 0.0 stddev 0.0 (3 samples)
Reply time [ms]: response 0.0 transfer 0.0
Reply size [B]: header 0.0 content 0.0 footer 0.0 (total 0.0)
Reply status: 1xx=0 2xx=0 3xx=0 4xx=0 5xx=0
CPU time [s]: user 11.44 system 4.20 (user 73.1% system 26.9% total 100.0%)
Net I/O: 0.0 KB/s (0.0*10^6 bps)
Errors: total 1 client-timo 1 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 addrinuse 0 other 0
Unconnected timeouts 0 connected timeouts 1 total (1) client_timeouts 1
Call Statistics:
call number conn number request size response size % bytes recvd byte rate conn time response time total time HTTP status time limit timed out file requested
(bytes) (bytes) (Mbps) (s) (s) (s) (s)
0 0 1 0 0.00 0.0 0.0002260 0.0018110 0.0020370 0 0.0001000 yes-C /docs/1B.txt
1 0 -1 0 -0.00 nan 0.0000000 0.0000000 0.0000000 0 0.0000000 NA --
Session rate [sess/s]: min 0.00 avg 0.00 max 0.00 stddev 0.00 (0/1)
Session: avg 0.00 connections/session
Session lifetime [s]: 0.0
Session failtime [s]: 0.0
Session length histogram: 1
Solutions:
Two (easy) ways:
1)stop the sess_destroyed function from being so "helpfull"
-if a rate has not been specified by the user, don't make the call to core_close
2)recognize that the sess_destroyed function has already done the work
-when core.c conn_timeout is called store a local copy of the conn id
-before calling the core_close function make sure they match
Suggestion:
Use solution 2
-it is very simple
-solution 1 is more of a bandaid
>it is not clear if this will actually solve the underlying problem
>it may have unknow affects
-beyond this problem solution 2 it is a good thing
>should be sure what you are operating on is what you think it is
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/README.UW/README.STABLE_STATS
================================================
The STABLE_STATS feature defines a ramp-up and ramp-down time for
an experiment. Sessions that start before the ramp-up period expires
are not counted in the statistics, and sessions that start within the
ramp-down time at the end of the experiment are also not counted.
The ramp-up and ramp-down periods are specified using --ramp-up-num-conns
and --ramp-down-num-conns, and these parameters are specified as numbers
of connections. Each session uses a single connection, so when sessions
are in use, the number of connections is equal to the number of sessions.
This feature is can be enabled by defining STABLE_STATS. Because
STABLE_STATS adds some values to the param struct, it needs to be defined
everywhere param is used; so I define STABLE_STATS in the configure file
rather than Makefile.in. This is likely not the right way to do this.
It is implemented mostly in stat/basic.c. It is controlled by two
variables stable_conns_start and stable_conns_end that are set to the values
supplied on the command line, or to default values that will select all
connections. Each connection is given an id number in sequence. If
the connection id is larger than stable_conns_start and smaller than
stable_conns_end, then an 'is_stable' flag is set true for that connection,
otherwise it is set false.
The code is modified to keep two versions of the most important statistics;
one set that includes only connections that are stable, and the other
that collects statistics for all connections. To avoid changing the
data scripts that extract information from the output, the stable stats
values are reported using the existing labels and the statistics
for all connections are reported using new labels that start with "All".
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/README.UW/README.STAGGER_START
================================================
The --stagger-start option causes httperf to start multiple httperf clients
at slightly different times to avoid burstiness in the requests. Without
this option, if all instances of httperf start at approximately the same
time, they will issue requests at the same time. With these synchronized
requests, the traffic consists of large bursts of requests that cause an
unrealistic load on the test server.
The session period is divided by the number of clients, and each client
delays for a different fraction of the session period before starting the
first session, based on client ID. This will have the effect of staggering
the requests from the different clients rather than synchronizing them.
This option has the greatest effect when using a uniform rate. If a rate
distribution is used, the staggering won't make much of a difference.
This modification is not surrounded by an #ifdef since it is simple
and has no effect if the option is not selected.
It is implemented by modifying the rate_generator_start() function in
gen/rate.c. If param.client.stagger_start is set, this routine adds
a small delay to the deadline for when the first session should start.
Subsequent arrival delays are calculated relative to the first in tick(),
so with deterministic arrival rates, the clients will continue to issue
requests in a staggered fashion throughout the experiment.
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/README.UW/README.TIMEOUT
================================================
High Level Overview:
Notation:
T is the value --timeout=T
A connection must be established in T seconds or the client will timeout
Once a connection is established, the client must send the request within T seconds or
the client will timeout
Once the request is sent the response must be completely received within T seconds or
the client will timeout
Note: The concept of a session is only used by HTTPERF in the
context of generating a workload specified by wsess or wsesslog. The
core of HTTPERF, which is responsible for establishing connections
and sending requests to the server, is not aware of the concept of a
session. As such, there are no timers that span the length of a
session.
Lower Level Details:
Timer started when:
(1)establishing a connection (time = T)
(2)when a call is moved to the sendq (time = T)
(3)another spot in do_send...*
(4)when a call is moved to the recvq (time = T)
(5)after some data has been recved but not all (time = R)
R is the time remaining on the prevous timer started at (4) or (5)
Timer cancelled when (if a timer exists):
-core_close:
-a connection fails
-a connection times out
-a call finishs
-a session finishs
-core_loop_handle_socket:
-when a connection is established
-when the request is sent
-when data is recved
Observations:
-timers are created a minimum of 3 times for a connection (assuming 1 call per conn)
>twice before sending the request [timer start: (1), (2)]
>once after sending and before receiving any data [timer start: (4)]
>larger file requests create more timers then small file requests
#"extra" timers are created during the receiving process
#the delay they are created with is determined by the calls timeout time**
#timer start: (5)
Aside:
-wsesslog uses timers to create user think time
-the rate generator uses timers
>it allows them to time out (ie they are not cancelled)
-in httperf.c there are two timers that are/can be created
>perf_sample
>dump_stats
* -I believe this is used when the request is large but I am not sure
I have not run any tests that have caused this to occur
** -the timeout time is first set at the time when the call is moved to the sendq
It is reset before all other timers are created with the exception of this one
-the delay the timer is created with can be a negative number which means the timer is created with
the default value of 1 'tick' (which is the smallest it can be given)
This means that a call can go passed its timeout time as long data continues to
be received in 1 tick intervals
-I do not know what 1 'tick' is in terms of time in seconds
#########################################################
static void schedule_timeouts (Conn *s)
---------------------------------------------------------
{
Any_Type arg;
Time timeout = 0.0;
/* if there is already a timer running for this connection
* then do not add a new one */
if (s->watchdog)
return;
/* take the shortest timeout between the first item in the sendq
* and the first item in the recvq */
if (s->sendq)
timeout = s->sendq->timeout;
if (s->recvq && (timeout == 0.0 || timeout > s->recvq->timeout))
timeout = s->recvq->timeout;
if (timeout > 0.0)
{
arg.vp = s;
s->watchdog = timer_schedule (conn_timeout, arg,timeout - timer_now ()); /* timer starts: (2), (4), (5) */
}
}
#########################################################
#########################################################
int core_connect (Conn *s)
---------------------------------------------------------
SYSCALL (CONNECT,result = connect (sd, sin, sizeof (*sin)));
saved_err = errno;
if (result == 0)
{
#ifdef HAVE_SSL if (param.use_ssl)
{
core_ssl_connect (s);
}
else
#endif
{
s->state = S_CONNECTED;
arg.l = 0;
event_signal (EV_CONN_CONNECTED, (Object *) s, arg);
}
}
else if (errno == EINPROGRESS)
{
/* The socket becomes writable only after the connection has
been established. Hence we wait for writability to
detect connection establishment. */
s->state = S_CONNECTING;
interested_in_writing (s);
/* it is neccisary to 'manually' add this timer because there is
* no calls in the sendq or recvq, whose timeouts would have been used
* in the call to interested_in_writing() */
if (param.timeout > 0.0)
{
arg.vp = s;
assert (!s->watchdog);
s->watchdog = timer_schedule (conn_timeout, arg, param.timeout); /* timer start: (1) */
}
}
else
{
len = sizeof (async_errno);
if (getsockopt (sd, SOL_SOCKET, SO_ERROR, &async_errno, &len) ==0 && async_errno != 0)
{
errno = async_errno;
}
saved_err = async_errno;
#########################################################
#########################################################
static void interested_in_reading (Conn *s)
---------------------------------------------------------
{
set_active (s, &rdfds);
#ifdef HAVE_EPOLL
if (param.use_epoll)
update_epoll_event (s);
#endif
schedule_timeouts (s); /* timer start: (4), (5) */
}
#########################################################
#########################################################
static void interested_in_writing (Conn *s)
---------------------------------------------------------
{
set_active(s, &wrfds);
#ifdef HAVE_EPOLL
if (param.use_epoll)
update_epoll_event (s);
#endif
schedule_timeouts (s); /* timer start: (2) */
}
#########################################################
#########################################################
static void core_loop_handle_socket (int sd, int is_readable, int is_writable)
---------------------------------------------------------
if (conn->watchdog)
{
timer_cancel (conn->watchdog);
conn->watchdog = 0;
}
if (conn->state == S_CONNECTING)
{
#ifdef HAVE_SSL
if (param.use_ssl)
core_ssl_connect (conn);
else
#endif
{
if (is_writable)
{
len = sizeof (async_errno);
rc = getsockopt (sd, SOL_SOCKET, SO_ERROR, &async_errno, &len);
if (rc < 0)
{
printf("%s: getsockopt failed\n", __FUNCTION__);
perror(__FUNCTION__);
exit(1);
}
else if (async_errno == 0)
{
FD_CLR (sd, &wrfds);
conn->state = S_CONNECTED;
arg.l = 0;
event_signal (EV_CONN_CONNECTED, (Object *) conn, arg);
}
else
{
// printf("%s: connect failed %s\n", __FUNCTION__, strerror(async_errno));
conn_failure(conn, async_errno);
}
}
}
}
else
{
if (is_writable && conn->sendq)
do_send (conn);
if (is_readable && conn->recvq)
do_recv (conn);
}
#########################################################
#########################################################
called by:
conn_failure
conn_timeout
session_destroyed (gen/session.c)
call_done (gen/session.c)
void core_close (Conn *conn)
---------------------------------------------------------
if (conn->watchdog)
{
timer_cancel (conn->watchdog);
conn->watchdog = 0;
}
#########################################################
#########################################################
static void do_send (Conn *conn)
---------------------------------------------------------
if (call->req.iov_index < NELEMS (call->req.iov))
{
/* there are more header bytes to write */
call->timeout = param.timeout ? timer_now () + param.timeout : 0.0;
interested_in_writing (conn); /* timer start: (3) */
return;
}
/* we're done with sending this request */
conn->sendq = call->sendq_next;
if (!conn->sendq)
{
conn->sendq_tail = 0;
FD_CLR (sd, &wrfds);
}
arg.l = 0;
event_signal (EV_CALL_SEND_STOP, (Object *) call, arg);
if (conn->state >= S_CLOSING)
{
call_dec_ref (call);
return;
}
/* get ready to receive matching reply (note that we implicitly
pass on the reference to the call from the sendq to the
recvq): */
call->recvq_next = 0;
if (!conn->recvq)
conn->recvq = conn->recvq_tail = call;
else
{
conn->recvq_tail->recvq_next = call;
conn->recvq_tail = call;
}
call->timeout = param.timeout + param.think_timeout;
if (call->timeout > 0.0)
call->timeout += timer_now ();
interested_in_reading (conn); /* timer start: (4) */
if (conn->state < S_REPLY_STATUS)
conn->state = S_REPLY_STATUS; /* expecting reply status */
if (!conn->sendq)
return;
arg.l = 0;
event_signal (EV_CALL_SEND_START, (Object *) conn->sendq, arg);
if (conn->state >= S_CLOSING)
return;
}
}
#########################################################
#########################################################
static void do_recv (Conn *s)
---------------------------------------------------------
/* if there is more information expected then was received in
the buffer then a timer is created */
if (s->recvq)
interested_in_reading (c->conn); /* timer start: (5) */
}
#########################################################
#########################################################
called by:
-send_calls (gen/session.c)
int core_send (Conn *conn, Call *call)
---------------------------------------------------------
/* insert call into connection's send queue: */
call_inc_ref (call);
call->sendq_next = 0;
if (!conn->sendq)
{
conn->sendq = conn->sendq_tail = call;
arg.l = 0;
event_signal (EV_CALL_SEND_START, (Object *) call, arg);
if (conn->state >= S_CLOSING)
return -1;
call->timeout = param.timeout ? timer_now () + param.timeout : 0.0;
interested_in_writing (conn); /* timer start: (2) */
}
else
{
conn->sendq_tail->sendq_next = call;
conn->sendq_tail = call;
}
#########################################################
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/README.UW/README.WSESSLOG
================================================
The log file specified by the --wsesslog option is used to generate
the workload created by httperf. This log file consists of a set of
sessions, where a session is a set of requests sent to a web server.
The connection settings for the web server is set by the command line
options --server, --port and --ssl. In order to allow individual
sessions to use different connection settings (for example some
sessions use ssl and others don't), the ability to specify these
settings for individual sessions has been added. If the log file does
not specify the connection settings, the command line options are used
as a default.
To specify connections settings for an individual session in the
wsesslog file, an additional line must be added, before the set of
requests. This line is structered as follows:
session [port=X] [server=Y] [ssl=Z]
/uri
/uri
...
The individual parameters can be listed in any order, however the
first item must be the word 'session' followed by whitespace.
Additionaly, none of the parameters are manditory.
In order to allow the call_stats statistics module to work with a
wsesslog specified workload, a new request parameter was added to
specify the size of the request. If this parameter is not set then the
call_stats module has no way of knowing the size of the request, and
will assign it a value of -2.
The following is an example of a log file that can be used with the
call_stats module, which includes some sample uses of session specific
connection settings:
session ssl=off server=localhost port=6800
/docs/10K.txt size=10240
/docs/100K.txt size=102400
/docs/10K.txt size=10240
/docs/100K.txt size=102400
session ssl=on port=6444 server=129.97.169.14
/docs/10B.txt size=10
/docs/1M.txt size=1048576
/docs/1K.txt size=1024
/docs/10K.txt size=10240
session ssl=off port=6801
/docs/10K.txt size=10240
/docs/100K.txt size=102400
/docs/10K.txt size=10240
/docs/100K.txt size=102400
session ssl=on port=6443 server=localhost
/docs/10B.txt size=10
/docs/1M.txt size=1048576
/docs/1K.txt size=1024
/docs/10K.txt size=10240
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/README.UW/man-call_stats.txt
================================================
Examples of httperf used with call stats:
httperf --port=6800 --num-calls=4 --num-conns=2 --uri=/docs/10K.txt --call-stats=6 --call-stats-file=call_stats.in --timeout=1
This will track the first 6 of 8 calls (2 connections, each with 4 calls) made to the server, using call_stats.in to determine the size(s) of the file(s) requested.
httperf --port=6800 --wsesslog=3,0,input.log --call-stats=0 --timeout=1
This will use the input.log file to generate the workload and print the statistics for each call as it is completed.
The call stats options are used as follows:
--call-stats=X
This will cause httperf to track statistics for the first X calls made to the server, where X>0. If X=0 then statistics will be printed on the fly, as the calls complete. This option needs to be used in combination with --call-stats-file or --wsesslog so that the proper file size can be determined. If a file is requested, who's size has not been specified, it will be assigned a size of -2 bytes so that it can be easily identified.
--call-stats-file=S
This will inform httperf to use the file S to determine the sizes of the files requested from the server
The first line of the file S must be a number N, which indicates the number of (URI, file size) mappings. The next N lines consist of a URI and an integer seperated by a single space. The integer is the size of the file in bytes.
A sample call-stats-file is as follows:
13
/docs/1B.txt 1
/docs/2B.txt 2
/docs/10B.txt 10
/docs/960B.txt 960
/docs/14900B.txt 14900
/docs/1K.txt 1024
/docs/2K.txt 2048
/docs/3K.txt 3072
/docs/4K.txt 4096
/docs/5K.txt 5120
/docs/10K.txt 10240
/docs/100K.txt 102400
/docs/1M.txt 1048576
Sample output:
$ httperf --port=6800 --num-calls=4 --num-conns=2 --uri=/docs/10K.txt --call-stats=6 --call-stats-file=call_stats.in --timeout=1
httperf: Collecting call stats buffer size = 6
httperf: file sizes from = call_stats.in
httperf --timeout=1 --client=0/1 --server=localhost --port=6800 --uri=/docs/10K.txt --send-buffer=4096 --recv-buffer=16384 --call-stats=6 --call-stats-file=call_stats.in --num-conns=2 --num-calls=4
Run on hostname: scsltxxx
Run at: Wed Aug 11 10:29:47 2010
Effective CPU mask: 0x3
hash_enter: localhost 6800
stat basic init: using maximum errno = 500
Maximum connect burst length: 1
Total: connections 2 requests 8 replies 8 test-duration 1.100 s
Number of connected connections is currently = 0
Connection rate: 1.8 conn/s (550.1 ms/conn, <=1 concurrent connections)
Connected connection rate: 1.8 conn/s (550.1 ms/conn, <=1 concurrent connected connections)
Connection time [ms]: min 382.9 avg 550.1 max 717.2 median 382.5 stddev 236.4
Connection time [ms]: connect 0.5
Connection length [replies/conn]: 4.000
Response time (no timeouts) [ms]: 137.5
Response time (only timeouts) [ms]: nan
Response time (all) [ms]: 137.5
Request rate: 7.3 req/s (137.5 ms/req)
Request size [B]: 74.0
Overall reply rate: 7.3 replies/sec
Reply rate [replies/s]: min 0.0 avg 0.0 max 0.0 stddev 0.0 (0 samples)
Reply time [ms]: response 18.7 transfer 118.7
Reply size [B]: header 71.0 content 10240.0 footer 0.0 (total 10311.0)
Reply status: 1xx=0 2xx=8 3xx=0 4xx=0 5xx=0
CPU time [s]: user 0.86 system 0.20 (user 77.8% system 18.2% total 96.0%)
Net I/O: 73.7 KB/s (0.6*10^6 bps)
Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 addrinuse 0 other 0
Unconnected timeouts 0 connected timeouts 0 total (0) client_timeouts 0
Call Statistics (buffer filled):
call number conn number request size response size % bytes recvd byte rate conn time response time total time HTTP status time limit timed out file requested
(bytes) (bytes) (Mbps) (s) (s) (s) (s)
0 0 10240 10240 100.00 1.6 0.0001609 0.0499520 0.0501130 200 1.0000000 no /docs/10K.txt
1 0 10240 10240 100.00 2.5 0.0000000 0.0331109 0.0331109 200 1.0000000 no /docs/10K.txt
2 0 10240 10240 100.00 0.8 0.0000000 0.0980442 0.0980442 200 1.0000000 no /docs/10K.txt
3 0 10240 10240 100.00 0.4 0.0000000 0.2016768 0.2016768 200 1.0000000 no /docs/10K.txt
4 1 10240 10240 100.00 0.4 0.0008731 0.2034709 0.2043440 200 1.0000000 no /docs/10K.txt
5 1 10240 10240 100.00 0.4 0.0000000 0.1899390 0.1899390 200 1.0000000 no /docs/10K.txt
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/README.WINDOWS
================================================
Thu Apr 17 12:12:51 2003
Tim Brecht
I was able to produce a version of httperf that
looks like it can be run on Windows machines.
I've compiled it on a cygwin environment but
have been able to run a few simple tests in a non cygwin
environment (Windows 2000 and Windows 98).
----------------------------------------------------------------------
NOTES:
------
It seems that with the Nagle algorithm disabled
that httperf.exe sends a separate packet for each element
of a writev vector. Httperf uses several vectors for
each request. This can lead to significant performance
hits for both the client and the server.
E.g., the request arrives in something like 5-7 packets
and depending on how the server is implemented it may require
that many reads to get one request from the socket.
I've only experimented a bit with leaving the Nagle
algorithm enabled. This reduces the number of packets needed
for a request (still > 1) but I haven't checked on timing/delays.
----------------------------------------------------------------------
INCREASING THE NUMBER OF FDS:
-----------------------------
Cygwin seems to be set up to handle a user defined FD_SETSIZE.
So to increase the number of open file descriptors (default is 64)
with CYGWIN.
in "config.h"
#define FD_SETSIZE (1024)
----------------------------------------------------------------------
RUNNING:
--------
After producing a statically compiled version of the
httperf executable (httperf.exe) I copied it and
the CYGWIN DLL (cygwin1.dll) to another machine
(both in the same directory) and was able to run a few simple tests.
The file cygwin1.dll can be found in a cygwin installation in the
/bin directory.
----------------------------------------------------------------------
COMPILING:
---------
Compiling httperf my version of cygwin, which was running on
Windows 2000.
% mkdir build
% cd build
% ../configure
Then I modified config.h so that a few things that autoconf
defined were not defined.
/* Define if you have the <openssl/ssl.h> header file. */
/* #define HAVE_OPENSSL_SSL_H 1 */
/* Define if you have the crypto library (-lcrypto). */
/* #define HAVE_LIBCRYPTO 1 */
I modified the Makefile to remove
# LIBS = -lcrypto -lm
LIBS = -lm
From the build directory I modified all the Makefiles
so that everything is statically linked.
% vi Makefile */Makefile
# LDFLAGS =
LDFLAGS = -static -Bstatic
----------------------------------------------------------------------
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/TBB-NEW
================================================
Working on code Adam did for
handling headers (including range requests).
Think about making this code selectable via --with or --without
options.
Added stuff to use an increased number of open files.
The "include" directory has new definitions for __FD_SETSIZE.
This is used in the Makefile.in where -DBIG_FD_SETSIZE is set.
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/TODO
================================================
Wed Oct 17 10:15:25 EDT 2012
UW
- Long term: add ability to specify start_conn_num and end_conn_num
for stable stats (so this works without wsesslog).
- Test compiled and ./httperf
MAC OS X
Linux Ubuntu 12.04
Linux (old Redhat version on rocket)
../configure
../configure --enable-debug
- Clean up lots of warnings and at some point turn on -Wall -Werror
- Talk to Tyler about what the code is doing that generates these
warnings and clean up that code.
../../stat/call_stats.c:315: warning: operation on 'i' may be undefined
- Need man page info for --calls-stats
- Need man page info for --ramp-up-num-conns
- Need man page info for --ramp-down-num-conns
- Need man page info for --stagger-start
- Need man page info for --spec-stats
- *** Check if SSL/HTTPS can be specified in wsesslog and if it works
- check fpsetmask(0) on FreeBSD
- Modify Makefile.in to do the right stuff
- Possibly Makefile.uwinc
- Test the SSL case
- Is HAVE_SCHED_AFFINITY off by default (it should be)
- Integrate _HAVE_EPOLL HASVE_SCHED_AFFINITY, etc. into configure
- Cleanup #ifdef OLDWAY
----------------------------------------------------------------------
Some ideas (contributions/patches welcome):
- wsesspage: don't fetch same object more than once (assume the existence
of a cache)---this avoids trouble with recursive pages
- make httperf easier to use; some ideas:
o Make httperf into a network daemon that is controlled by
an httperf frontend. This would allow running tests with
a single command line even when multiple clients are involved.
The performance results should be reported both on a
per-client basis and in a summarized form reporting overall
server behavior.
o Provide (default) scripts to run certain benchmarks.
o Provide (default) scripts to produce performance graphs.
- use cycle registers to get time on CPUs that have such registers
(IA-64, PA-RISC, x86, Alpha, at least)
- randomize the uri's generated by --wset so we can defeat file prefetching
that the server (or the server's OS) may attempt to do
Done:
+ Specifying --session-cookie without specifying a session workload causes
httperf to core-dump (reported by Dick Carter, 10/13/98)
+ elevate `Session' to same level as Call and Connection
+ sample session throughput when using sessions (not just rate throughput)
+ integrate Dick's wsesslog
+ write man-page
+ chunked replies fail after the first reply (at least on HP-UX)
+ core.c does not fully support pipelined requests yet; would require
changes to the watchdog management
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/aclocal.m4
================================================
AC_DEFUN(AC_TYPE_LONG_LONG,
[AC_CACHE_CHECK(for long long type, ac_cv_type_long_long,
[AC_TRY_COMPILE(, [unsigned long long x, y, z; x = y/z],
ac_cv_type_long_long=yes, ac_cv_type_long_long=no)])
if test $ac_cv_type_long_long = yes; then
AC_DEFINE(u_wide,unsigned long long)
else
AC_DEFINE(u_wide,unsigned long)
fi
])
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/bt2line
================================================
#!/bin/bash
if [ $# -ne 1 ] ; then
echo "Usage: $0 executable"
exit
fi
executable=$1
while read line ; do
addr=$(echo $line | grep -o '\[.*\]' | grep -o '[abcdefx0-9]*')
if [ -n "$addr" ] ; then
src=$(addr2line -e $executable $addr)
echo $line | sed "s|\[\(.*\)\]|\[$src\]|"
else
echo $line
fi
done
================================================
FILE: benchmarks/media-streaming/client/files/videoperf/call.c
================================================
/*
httperf -- a tool for measuring web server performance
Copyright (C) 2000 Hewlett-Packard Company
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
This file is part of httperf, a web server performance measurment
tool.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should ha
gitextract_ld6tfyvy/
├── .github/
│ ├── scripts/
│ │ └── build-images.sh
│ └── workflows/
│ ├── build-images.yaml
│ └── spell-check.yaml
├── .gitignore
├── .spellcheck.yml
├── .wordlist.txt
├── LICENSE.md
├── README.md
├── benchmarks/
│ ├── data-analytics/
│ │ └── latest/
│ │ ├── Dockerfile
│ │ └── files/
│ │ ├── benchmark.sh
│ │ ├── categories
│ │ ├── docker-entrypoint.py
│ │ └── mahout-examples-0.13.0-job.jar
│ ├── data-caching/
│ │ ├── client/
│ │ │ ├── Dockerfile
│ │ │ └── docker-entrypoint.sh
│ │ └── server/
│ │ └── Dockerfile
│ ├── data-serving/
│ │ ├── .gitignore
│ │ ├── client/
│ │ │ ├── Dockerfile
│ │ │ ├── load.sh
│ │ │ ├── setup_tables.txt
│ │ │ └── warmup.sh
│ │ └── server/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ └── docker-entrypoint.py
│ ├── data-serving-relational/
│ │ ├── client/
│ │ │ ├── Dockerfile
│ │ │ ├── docker-entrypoint.py
│ │ │ └── template/
│ │ │ ├── database.conf
│ │ │ ├── oltp-rw.py
│ │ │ └── tpcc.py
│ │ └── server/
│ │ ├── Dockerfile
│ │ └── docker-entrypoint.py
│ ├── graph-analytics/
│ │ └── latest/
│ │ ├── Dockerfile
│ │ ├── benchmark/
│ │ │ ├── build.sbt
│ │ │ ├── run_benchmark.sh
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── scala/
│ │ │ └── GraphAnalytics.scala
│ │ └── files/
│ │ └── entrypoint.sh
│ ├── in-memory-analytics/
│ │ └── latest/
│ │ ├── Dockerfile
│ │ ├── files/
│ │ │ ├── entrypoint.sh
│ │ │ ├── spark-defaults.conf
│ │ │ └── spark-env.sh
│ │ └── movielens-als/
│ │ ├── build.sbt
│ │ ├── run_benchmark.sh
│ │ └── src/
│ │ └── main/
│ │ └── scala/
│ │ └── MovieLensALS.scala
│ ├── media-streaming/
│ │ ├── client/
│ │ │ ├── Dockerfile
│ │ │ └── files/
│ │ │ ├── docker-entrypoint.sh
│ │ │ ├── run/
│ │ │ │ ├── benchmark.sh
│ │ │ │ ├── hostlist.client
│ │ │ │ ├── hostlist.server
│ │ │ │ ├── peak_hunter/
│ │ │ │ │ ├── launch_hunt_bin.sh
│ │ │ │ │ └── launch_remote.sh
│ │ │ │ └── process_logs.sh
│ │ │ └── videoperf/
│ │ │ ├── AUTHORS
│ │ │ ├── COPYRIGHT
│ │ │ ├── ChangeLog
│ │ │ ├── Makefile
│ │ │ ├── Makefile.in
│ │ │ ├── NEWS
│ │ │ ├── README
│ │ │ ├── README.UW/
│ │ │ │ ├── README.CALL_STATS
│ │ │ │ ├── README.DYNOUT
│ │ │ │ ├── README.NO_RATE_HANG
│ │ │ │ ├── README.STABLE_STATS
│ │ │ │ ├── README.STAGGER_START
│ │ │ │ ├── README.TIMEOUT
│ │ │ │ ├── README.WSESSLOG
│ │ │ │ └── man-call_stats.txt
│ │ │ ├── README.WINDOWS
│ │ │ ├── TBB-NEW
│ │ │ ├── TODO
│ │ │ ├── aclocal.m4
│ │ │ ├── bt2line
│ │ │ ├── call.c
│ │ │ ├── call.h
│ │ │ ├── config.cache
│ │ │ ├── config.guess
│ │ │ ├── config.h
│ │ │ ├── config.h.in
│ │ │ ├── config.log
│ │ │ ├── config.status
│ │ │ ├── config.sub
│ │ │ ├── configure
│ │ │ ├── configure.in
│ │ │ ├── conn.c
│ │ │ ├── conn.h
│ │ │ ├── core.c
│ │ │ ├── core.h
│ │ │ ├── core_connect
│ │ │ ├── event.c
│ │ │ ├── event.h
│ │ │ ├── gen/
│ │ │ │ ├── Makefile
│ │ │ │ ├── Makefile.in
│ │ │ │ ├── call_seq.c
│ │ │ │ ├── conn_rate.c
│ │ │ │ ├── misc.c
│ │ │ │ ├── rate.c
│ │ │ │ ├── rate.h
│ │ │ │ ├── sess_cookie.c
│ │ │ │ ├── session.c
│ │ │ │ ├── session.h
│ │ │ │ ├── uri_fixed.c
│ │ │ │ ├── uri_wlog.c
│ │ │ │ ├── uri_wset.c
│ │ │ │ ├── videosesslog.c
│ │ │ │ ├── videosesslog.h
│ │ │ │ ├── wsess.c
│ │ │ │ └── wsesspage.c
│ │ │ ├── http.c
│ │ │ ├── http.h
│ │ │ ├── httperf.c
│ │ │ ├── httperf.h
│ │ │ ├── httperf.man
│ │ │ ├── idleconn.c
│ │ │ ├── install-sh
│ │ │ ├── lib/
│ │ │ │ ├── COPYING.txt
│ │ │ │ ├── Makefile
│ │ │ │ ├── Makefile.in
│ │ │ │ ├── README
│ │ │ │ ├── getopt.c
│ │ │ │ ├── getopt.h
│ │ │ │ ├── getopt1.c
│ │ │ │ └── ssl_writev.c
│ │ │ ├── mkinstalldirs
│ │ │ ├── notes.txt
│ │ │ ├── object.c
│ │ │ ├── object.h
│ │ │ ├── out_1080p_0.txt
│ │ │ ├── output.log
│ │ │ ├── run-httperf
│ │ │ ├── sess.c
│ │ │ ├── sess.h
│ │ │ ├── stat/
│ │ │ │ ├── Makefile
│ │ │ │ ├── Makefile.in
│ │ │ │ ├── basic.c
│ │ │ │ ├── call_stats.c
│ │ │ │ ├── call_stats.h
│ │ │ │ ├── print_reply.c
│ │ │ │ ├── sess_stat.c
│ │ │ │ ├── spec_stats.c
│ │ │ │ ├── spec_stats.h
│ │ │ │ └── stats.h
│ │ │ ├── sys_sched_affinity.c
│ │ │ ├── sys_sched_affinity.h
│ │ │ ├── tags
│ │ │ ├── timeout
│ │ │ ├── timer.c
│ │ │ ├── timer.h
│ │ │ └── ttest.c
│ │ ├── dataset/
│ │ │ ├── Dockerfile
│ │ │ ├── bootstrap.sh
│ │ │ └── files/
│ │ │ ├── download_video_files.sh
│ │ │ └── filegen/
│ │ │ ├── Makefile
│ │ │ ├── gen_fileset.c
│ │ │ ├── generate_video_files_and_logs.sh
│ │ │ ├── make_zipf.c
│ │ │ ├── params/
│ │ │ │ ├── 240p
│ │ │ │ ├── 360p
│ │ │ │ ├── 480p
│ │ │ │ └── 720p
│ │ │ └── video_gen.py
│ │ └── server/
│ │ ├── Dockerfile
│ │ ├── entrypoint.sh
│ │ └── files/
│ │ ├── HTMLWebPlayer/
│ │ │ ├── index.html
│ │ │ └── js/
│ │ │ └── helper.js
│ │ ├── limits.conf.append
│ │ └── nginx.location.append
│ ├── web-search/
│ │ ├── client/
│ │ │ ├── Dockerfile
│ │ │ ├── docker-entrypoint.py
│ │ │ └── files/
│ │ │ └── search/
│ │ │ ├── LICENSE
│ │ │ ├── build.properties
│ │ │ ├── build.xml
│ │ │ ├── config/
│ │ │ │ ├── logging.properties
│ │ │ │ └── security/
│ │ │ │ └── driver.policy
│ │ │ ├── src/
│ │ │ │ └── sample/
│ │ │ │ └── searchdriver/
│ │ │ │ ├── terms_ordered
│ │ │ │ ├── terms_original
│ │ │ │ ├── terms_random
│ │ │ │ └── terms_shuffled
│ │ │ └── template/
│ │ │ ├── Random.java.in
│ │ │ ├── Zipfian.java.in
│ │ │ ├── head.java.in
│ │ │ └── run.xml.in
│ │ ├── dataset/
│ │ │ ├── Dockerfile
│ │ │ └── docker-entrypoint.sh
│ │ ├── index/
│ │ │ ├── Dockerfile
│ │ │ ├── entrypoint.sh
│ │ │ ├── files/
│ │ │ │ ├── nutch-default.xml
│ │ │ │ ├── schema.xml
│ │ │ │ ├── seed.txt
│ │ │ │ └── solrconfig.xml
│ │ │ └── generate_index.sh
│ │ └── server/
│ │ ├── Dockerfile
│ │ ├── docker-entrypoint.sh
│ │ └── files/
│ │ ├── limits.txt
│ │ ├── query.sh
│ │ ├── schema.xml
│ │ └── solrconfig.xml
│ └── web-serving/
│ ├── db_server/
│ │ ├── Dockerfile
│ │ └── entrypoint.sh
│ ├── faban_client/
│ │ ├── Dockerfile
│ │ └── files/
│ │ ├── commons-codec-1.2.jar
│ │ ├── commons-httpclient-3.1.jar
│ │ ├── commons-logging.jar
│ │ ├── fabanagents.jar
│ │ ├── fabancommon.jar
│ │ ├── fabandriver.jar
│ │ ├── users.list
│ │ ├── usersetup.properties
│ │ └── web20_benchmark/
│ │ ├── .classpath
│ │ ├── .gitignore
│ │ ├── .metadata/
│ │ │ ├── .mylyn/
│ │ │ │ └── .taskListIndex/
│ │ │ │ ├── segments.gen
│ │ │ │ └── segments_1
│ │ │ ├── .plugins/
│ │ │ │ ├── org.eclipse.core.resources/
│ │ │ │ │ ├── .root/
│ │ │ │ │ │ └── .indexes/
│ │ │ │ │ │ ├── history.version
│ │ │ │ │ │ ├── properties.index
│ │ │ │ │ │ └── properties.version
│ │ │ │ │ └── .safetable/
│ │ │ │ │ └── org.eclipse.core.resources
│ │ │ │ ├── org.eclipse.core.runtime/
│ │ │ │ │ └── .settings/
│ │ │ │ │ ├── org.eclipse.core.resources.prefs
│ │ │ │ │ ├── org.eclipse.jdt.ui.prefs
│ │ │ │ │ ├── org.eclipse.m2e.discovery.prefs
│ │ │ │ │ ├── org.eclipse.mylyn.context.core.prefs
│ │ │ │ │ ├── org.eclipse.mylyn.monitor.ui.prefs
│ │ │ │ │ ├── org.eclipse.mylyn.tasks.ui.prefs
│ │ │ │ │ ├── org.eclipse.team.cvs.ui.prefs
│ │ │ │ │ ├── org.eclipse.team.ui.prefs
│ │ │ │ │ ├── org.eclipse.ui.ide.prefs
│ │ │ │ │ ├── org.eclipse.ui.prefs
│ │ │ │ │ └── org.eclipse.ui.workbench.prefs
│ │ │ │ ├── org.eclipse.e4.workbench/
│ │ │ │ │ └── workbench.xmi
│ │ │ │ ├── org.eclipse.jdt.core/
│ │ │ │ │ ├── assumedExternalFilesCache
│ │ │ │ │ ├── externalFilesCache
│ │ │ │ │ ├── invalidArchivesCache
│ │ │ │ │ └── nonChainingJarsCache
│ │ │ │ ├── org.eclipse.jdt.ui/
│ │ │ │ │ ├── OpenTypeHistory.xml
│ │ │ │ │ ├── QualifiedTypeNameHistory.xml
│ │ │ │ │ └── dialog_settings.xml
│ │ │ │ ├── org.eclipse.m2e.logback.configuration/
│ │ │ │ │ ├── 0.log
│ │ │ │ │ └── logback.1.5.1.20150109-1820.xml
│ │ │ │ ├── org.eclipse.ui.ide/
│ │ │ │ │ └── dialog_settings.xml
│ │ │ │ └── org.eclipse.ui.workbench/
│ │ │ │ ├── dialog_settings.xml
│ │ │ │ └── workingsets.xml
│ │ │ └── version.ini
│ │ ├── .project
│ │ ├── .settings/
│ │ │ └── org.eclipse.jdt.core.prefs
│ │ ├── build/
│ │ │ ├── Usergen.jar
│ │ │ ├── Web20Driver.jar
│ │ │ ├── classes/
│ │ │ │ ├── users.txt
│ │ │ │ └── users.xml
│ │ │ ├── commons-codec-1.2.jar
│ │ │ ├── commons-httpclient-3.1.jar
│ │ │ ├── commons-logging.jar
│ │ │ ├── fabanagents.jar
│ │ │ ├── fabancommon.jar
│ │ │ ├── fabandriver.jar
│ │ │ └── lib/
│ │ │ └── Web20Driver.jar
│ │ ├── build.properties
│ │ ├── build.xml
│ │ ├── config/
│ │ │ └── logging.properties
│ │ ├── deploy/
│ │ │ ├── benchmark.xml
│ │ │ └── run.xml
│ │ ├── lib/
│ │ │ ├── commons-codec-1.2.jar
│ │ │ ├── commons-httpclient-3.1.jar
│ │ │ ├── commons-logging.jar
│ │ │ ├── fabanagents.jar
│ │ │ ├── fabancommon.jar
│ │ │ └── fabandriver.jar
│ │ ├── run/
│ │ │ ├── entrypoint.sh
│ │ │ └── gen
│ │ ├── src/
│ │ │ ├── org/
│ │ │ │ └── json/
│ │ │ │ ├── CDL.java
│ │ │ │ ├── Cookie.java
│ │ │ │ ├── CookieList.java
│ │ │ │ ├── HTTP.java
│ │ │ │ ├── HTTPTokener.java
│ │ │ │ ├── JSONArray.java
│ │ │ │ ├── JSONException.java
│ │ │ │ ├── JSONML.java
│ │ │ │ ├── JSONObject.java
│ │ │ │ ├── JSONString.java
│ │ │ │ ├── JSONStringer.java
│ │ │ │ ├── JSONTokener.java
│ │ │ │ ├── JSONWriter.java
│ │ │ │ ├── Property.java
│ │ │ │ ├── README
│ │ │ │ ├── XML.java
│ │ │ │ └── XMLTokener.java
│ │ │ ├── setup/
│ │ │ │ └── UserGenerator.java
│ │ │ ├── users.txt
│ │ │ ├── users.xml
│ │ │ ├── usersetup.properties
│ │ │ └── workload/
│ │ │ ├── driver/
│ │ │ │ ├── RandomStringGenerator.java
│ │ │ │ ├── UserPasswordPair.java
│ │ │ │ ├── Web20Client.java
│ │ │ │ ├── Web20Driver.java
│ │ │ │ └── Web20Driver.java.in
│ │ │ └── harness/
│ │ │ └── ElggBenchmark.java
│ │ └── users.list
│ ├── memcached_server/
│ │ └── Dockerfile
│ └── web_server/
│ ├── Dockerfile
│ ├── bootstrap.sh
│ └── files/
│ ├── limits.conf.append
│ ├── nginx_sites_avail_pt.append
│ ├── nginx_sites_avail_tls.append
│ ├── repos.append
│ └── settings_4.3.php
├── commons/
│ ├── base-os/
│ │ ├── Dockerfile.amd64
│ │ ├── Dockerfile.arm64
│ │ ├── Dockerfile.riscv64
│ │ └── build.sh
│ ├── cassandra/
│ │ ├── 3.11.6/
│ │ │ ├── Dockerfile
│ │ │ └── jvm.options
│ │ └── 4.1.0/
│ │ ├── Dockerfile
│ │ └── install.sh
│ ├── faban/
│ │ └── 1.4/
│ │ └── Dockerfile
│ ├── hadoop/
│ │ ├── 2.10.2/
│ │ │ ├── Dockerfile
│ │ │ └── files/
│ │ │ ├── core-site.xml.template
│ │ │ ├── entrypoint.sh
│ │ │ ├── example_benchmark.sh
│ │ │ ├── hadoop-start.py
│ │ │ ├── hdfs-site.xml.template
│ │ │ ├── mapred-site.xml.template
│ │ │ └── yarn-site.xml.template
│ │ └── 3.3.4/
│ │ ├── Dockerfile
│ │ └── files/
│ │ ├── core-site.xml.template
│ │ ├── hadoop-start.py
│ │ ├── hdfs-site.xml.template
│ │ ├── mapred-site.xml.template
│ │ └── yarn-site.xml.template
│ ├── java/
│ │ ├── openjdk11/
│ │ │ └── Dockerfile
│ │ └── openjdk17/
│ │ └── Dockerfile
│ ├── memcached/
│ │ ├── 1.6.10/
│ │ │ └── Dockerfile
│ │ └── 1.6.15/
│ │ └── Dockerfile
│ ├── mysql/
│ │ └── mariadb-10.6/
│ │ ├── Dockerfile
│ │ ├── bootstrap.sh
│ │ └── files/
│ │ └── execute.sh
│ ├── postgresql/
│ │ └── 15/
│ │ └── Dockerfile
│ └── spark/
│ ├── 2.4.5/
│ │ ├── Dockerfile
│ │ └── files/
│ │ ├── entrypoint.sh
│ │ ├── start-master-fg.sh
│ │ └── start-worker-fg.sh
│ └── 3.3.2/
│ ├── Dockerfile
│ └── files/
│ ├── entrypoint.sh
│ ├── start-master-fg.sh
│ └── start-worker-fg.sh
├── datasets/
│ ├── movielens-dataset/
│ │ └── latest/
│ │ ├── .gitignore
│ │ ├── Dockerfile
│ │ └── files/
│ │ └── myratings.csv
│ ├── twitter-dataset-graph/
│ │ └── latest/
│ │ └── Dockerfile
│ └── wikimedia-pages-dataset/
│ └── latest/
│ └── Dockerfile
└── docs/
├── benchmarks/
│ ├── data-analytics.md
│ ├── data-caching.md
│ ├── data-serving-relational.md
│ ├── data-serving.md
│ ├── graph-analytics.md
│ ├── in-memory-analytics.md
│ ├── media-streaming.md
│ ├── web-search.md
│ └── web-serving.md
├── buildx.md
└── datasets/
└── movielens-dataset.md
SYMBOL INDEX (676 symbols across 73 files)
FILE: benchmarks/data-serving-relational/client/docker-entrypoint.py
function get_dict (line 29) | def get_dict(lines):
function save_dict (line 45) | def save_dict(config_dict, lines):
FILE: benchmarks/data-serving-relational/server/docker-entrypoint.py
function get_ip (line 4) | def get_ip():
function get_dict (line 30) | def get_dict(lines):
function save_dict (line 46) | def save_dict(config_dict, lines):
FILE: benchmarks/data-serving/server/docker-entrypoint.py
function get_ip (line 4) | def get_ip():
FILE: benchmarks/media-streaming/client/files/videoperf/call.c
function inc_call_next_id (line 35) | int inc_call_next_id(int n)
function get_call_next_id (line 41) | int get_call_next_id ()
function call_init (line 46) | void
function call_deinit (line 68) | void
function call_append_request_header (line 73) | int
FILE: benchmarks/media-streaming/client/files/videoperf/call.h
type IOV_Element (line 37) | typedef enum IOV_Element
type Call (line 57) | typedef struct Call
FILE: benchmarks/media-streaming/client/files/videoperf/conn.c
function conn_init (line 36) | void
function conn_deinit (line 101) | void
FILE: benchmarks/media-streaming/client/files/videoperf/conn.h
type Call (line 45) | struct Call
type Conn_State (line 47) | typedef enum Conn_State
type Conn (line 64) | typedef struct Conn
FILE: benchmarks/media-streaming/client/files/videoperf/core.c
type timeval (line 69) | struct timeval
type epoll_event (line 73) | struct epoll_event
type sockaddr_in (line 78) | struct sockaddr_in
type Syscalls (line 125) | enum Syscalls
type hash_entry (line 153) | struct hash_entry
function BIG_FD_CLR (line 163) | void BIG_FD_CLR(int fd, big_fd_set *fdsetp)
function BIG_FD_ISSET (line 170) | int BIG_FD_ISSET(int fd, big_fd_set *fdsetp)
function BIG_FD_SET (line 177) | void BIG_FD_SET(int fd, big_fd_set *fdsetp)
function hash_code (line 184) | static int
type hash_entry (line 206) | struct hash_entry
type sockaddr_in (line 208) | struct sockaddr_in
type hash_entry (line 210) | struct hash_entry
type sockaddr_in (line 227) | struct sockaddr_in
function lffs (line 248) | static int
function port_put (line 270) | static void
function port_get (line 281) | static int
function conn_failure (line 323) | static void
function conn_timeout (line 334) | static void
function set_active (line 382) | static void
function update_epoll_event (line 396) | static void
function schedule_timeouts (line 434) | static void
function interested_in_reading (line 457) | static void
function interested_in_reading_no_timeout (line 468) | static void
function interested_in_writing (line 478) | static void
function do_send (line 489) | static void
function recv_done (line 645) | static void
function do_recv (line 665) | static void
type sockaddr_in (line 785) | struct sockaddr_in
type sockaddr_in (line 788) | struct sockaddr_in
type hash_entry (line 789) | struct hash_entry
type hostent (line 790) | struct hostent
function init_epoll (line 829) | static void
function core_init (line 872) | void
function core_ssl_connect (line 962) | void
function core_connect (line 1031) | int
function core_send (line 1250) | int
function core_close (line 1354) | void
function core_loop_handle_socket (line 1467) | static void
function core_loop_epoll (line 1536) | static void
function core_loop_select (line 1588) | void
function core_loop (line 1672) | void
function core_exit (line 1687) | void
FILE: benchmarks/media-streaming/client/files/videoperf/core.h
type big_fd_set (line 34) | typedef struct {
type sockaddr_in (line 43) | struct sockaddr_in
type sockaddr_in (line 46) | struct sockaddr_in
FILE: benchmarks/media-streaming/client/files/videoperf/event.c
type Event_Action (line 65) | typedef struct Event_Action
function event_register_handler (line 79) | void
function event_signal (line 98) | void
FILE: benchmarks/media-streaming/client/files/videoperf/event.h
type Event_Type (line 31) | typedef enum Event_Type
type Event (line 69) | typedef struct Event
FILE: benchmarks/media-streaming/client/files/videoperf/gen/call_seq.c
type Conn_Private_Data (line 40) | typedef struct Conn_Private_Data
function issue_calls (line 50) | static void
function conn_connected (line 73) | static void
function call_done (line 81) | static void
function call_destroyed (line 93) | static void
function init (line 114) | static void
FILE: benchmarks/media-streaming/client/files/videoperf/gen/conn_rate.c
function make_conn (line 42) | static int
function destroyed (line 58) | static void
function init (line 65) | static void
function start (line 77) | static void
FILE: benchmarks/media-streaming/client/files/videoperf/gen/misc.c
function call_created (line 103) | static void
function init (line 118) | static void
FILE: benchmarks/media-streaming/client/files/videoperf/gen/rate.c
function Time (line 48) | static Time
function Time (line 54) | static Time
function Time (line 65) | static Time
function Time (line 74) | static Time
function Time (line 91) | static Time
function tick (line 112) | static void
function done (line 135) | static void
function rate_generator_start (line 145) | void
function rate_generator_stop (line 204) | void
FILE: benchmarks/media-streaming/client/files/videoperf/gen/rate.h
type Rate_Generator (line 31) | typedef struct Rate_Generator
FILE: benchmarks/media-streaming/client/files/videoperf/gen/sess_cookie.c
type Sess_Private_Data (line 55) | typedef struct Sess_Private_Data
type Call_Private_Data (line 75) | typedef struct Call_Private_Data
function call_issue (line 88) | static void
function call_recv_hdr (line 118) | static void
function init (line 164) | static void
FILE: benchmarks/media-streaming/client/files/videoperf/gen/session.c
type Sess_Private_Data (line 78) | typedef struct Sess_Private_Data
type Conn_Private_Data (line 97) | typedef struct Conn_Private_Data
type Call_Private_Data (line 104) | typedef struct Call_Private_Data
function create_conn (line 115) | static void
function send_calls (line 199) | static void
function sess_destroyed (line 225) | static void
function conn_connected (line 253) | static void
function conn_failed (line 283) | static void
function conn_timeout (line 311) | static void
function call_done (line 326) | static void
function session_init (line 379) | void
function session_max_qlen (line 432) | size_t
function session_current_qlen (line 438) | size_t
function session_issue_call (line 453) | int
function Sess (line 485) | Sess *
function Sess (line 492) | Sess *
function Call (line 499) | Call *
FILE: benchmarks/media-streaming/client/files/videoperf/gen/uri_fixed.c
function set_uri (line 38) | static void
function init (line 45) | static void
FILE: benchmarks/media-streaming/client/files/videoperf/gen/uri_wlog.c
function set_uri (line 85) | static void
function init_wlog (line 121) | void
function stop_wlog (line 160) | static void
FILE: benchmarks/media-streaming/client/files/videoperf/gen/uri_wset.c
function set_uri (line 46) | static void
function init (line 92) | static void
FILE: benchmarks/media-streaming/client/files/videoperf/gen/videosesslog.c
type REQ (line 107) | typedef struct req REQ;
type req (line 108) | struct req
type BURST (line 135) | typedef struct burst BURST;
type burst (line 136) | struct burst
type Sess_Private_Data (line 147) | typedef struct Sess_Private_Data Sess_Private_Data;
type Sess_Private_Data (line 148) | struct Sess_Private_Data
type Session_Log_Desc (line 174) | typedef struct Session_Log_Desc Session_Log_Desc;
type Session_Log_Desc (line 176) | struct Session_Log_Desc
function sess_destroyed (line 205) | static void
function issue_calls (line 225) | static void
function user_think_time_expired (line 331) | static void
function build_request_mix_cdf (line 348) | static void
function sess_create (line 360) | static int
function prepare_for_next_burst (line 422) | static void
function call_destroyed (line 459) | static void
function REQ (line 501) | static REQ*
function BURST (line 523) | static BURST*
function parse_config (line 572) | static void
function init (line 1144) | static void
function start (line 1166) | static void
function Sess_Private_Data (line 1180) | Sess_Private_Data *
function set_missed_calls (line 1195) | void
function get_next_missed_size (line 1248) | int
function get_next_missed_timelimit (line 1262) | int
function print_remaining_uri (line 1276) | void
function num_missed_calls (line 1304) | int
FILE: benchmarks/media-streaming/client/files/videoperf/gen/wsess.c
type Sess_Private_Data (line 46) | typedef struct Sess_Private_Data
function issue_calls (line 62) | static void
function user_think_time_expired (line 94) | static void
function call_destroyed (line 108) | static void
function sess_create (line 147) | static int
function sess_destroyed (line 167) | static void
function init (line 187) | static void
function start (line 213) | static void
FILE: benchmarks/media-streaming/client/files/videoperf/gen/wsesspage.c
type Call_Private_Data (line 53) | typedef struct Call_Private_Data
type Sess_Private_Data (line 76) | typedef struct Sess_Private_Data
function issue_calls (line 102) | static void
function fetch_uri (line 151) | static void
function user_think_time_expired (line 206) | static void
function call_recv_hdr (line 220) | static void
function call_recv_data (line 256) | static void
function call_destroyed (line 414) | static void
function sess_create (line 462) | static int
function sess_destroyed (line 478) | static void
function init (line 498) | static void
function start (line 538) | static void
FILE: benchmarks/media-streaming/client/files/videoperf/http.c
function get_line (line 46) | static int
function parse_status_line (line 99) | static void
function parse_headers (line 195) | static void
function parse_footers (line 263) | static void
function parse_data (line 296) | static int
function xfer_chunked (line 326) | static void
function verify_reply_data (line 367) | void
function http_process_reply_bytes (line 436) | void
FILE: benchmarks/media-streaming/client/files/videoperf/httperf.c
type rusage (line 91) | struct rusage
type rusage (line 92) | struct rusage
type option (line 107) | struct option
function usage (line 177) | static void
function panic (line 234) | void
function no_op (line 245) | void
function perf_sample (line 250) | static void
function dump_stats (line 263) | static void
function sigsegv_handler (line 277) | void sigsegv_handler(int sig) {
function main (line 289) | int
FILE: benchmarks/media-streaming/client/files/videoperf/httperf.h
type Time (line 38) | typedef double Time;
type Any_Type (line 49) | typedef union
type Dist_Type (line 64) | typedef enum Dist_Type
type Load_Generator (line 76) | typedef struct Load_Generator
type Stat_Collector (line 85) | typedef struct Stat_Collector
type Rate_Info (line 98) | typedef struct Rate_Info
type Cmdline_Params (line 118) | typedef struct Cmdline_Params
type rusage (line 248) | struct rusage
type rusage (line 249) | struct rusage
FILE: benchmarks/media-streaming/client/files/videoperf/idleconn.c
type timeval (line 43) | struct timeval
function sigint_handler (line 45) | void
function main (line 61) | int
FILE: benchmarks/media-streaming/client/files/videoperf/lib/getopt.c
function exchange (line 260) | static void
function _getopt_internal (line 426) | int
function getopt (line 750) | int
function main (line 769) | int
FILE: benchmarks/media-streaming/client/files/videoperf/lib/getopt.h
type option (line 81) | struct option
type option (line 111) | struct option
type option (line 114) | struct option
type option (line 119) | struct option
FILE: benchmarks/media-streaming/client/files/videoperf/lib/getopt1.c
function getopt_long (line 62) | int
function getopt_long_only (line 78) | int
function main (line 96) | int
FILE: benchmarks/media-streaming/client/files/videoperf/lib/ssl_writev.c
function SSL_writev (line 52) | ssize_t
FILE: benchmarks/media-streaming/client/files/videoperf/object.c
type free_list_el (line 47) | struct free_list_el
type free_list_el (line 52) | struct free_list_el
function object_destroy (line 54) | static void
function object_expand (line 94) | size_t
function Object (line 102) | Object *
function object_dec_ref (line 157) | void
FILE: benchmarks/media-streaming/client/files/videoperf/object.h
type Object_Type (line 37) | typedef enum Object_Type
type Object (line 46) | typedef struct Object
FILE: benchmarks/media-streaming/client/files/videoperf/sess.c
function sess_init (line 29) | void
function sess_deinit (line 37) | void
function sess_failure (line 46) | void
FILE: benchmarks/media-streaming/client/files/videoperf/sess.h
type Sess (line 40) | typedef struct Sess
FILE: benchmarks/media-streaming/client/files/videoperf/stat/basic.c
function perf_sample (line 194) | static void
function conn_timeout (line 271) | static void
function conn_close (line 313) | static void
function conn_fail (line 330) | static void
function conn_created (line 402) | static void
function conn_connecting (line 410) | static void
function conn_connected (line 440) | static void
function conn_destroyed (line 485) | static void
function send_start (line 565) | static void
function send_stop (line 575) | static void
function recv_start (line 603) | static void
function recv_stop (line 631) | static void
function dump_stats (line 687) | static void
function err_report_init (line 942) | static void
function stable_stats_init (line 992) | static void
function init (line 1032) | static void
function dump (line 1084) | static void
function print_errno_info (line 1413) | void
function print_connected_info (line 1474) | void
FILE: benchmarks/media-streaming/client/files/videoperf/stat/call_stats.c
type call_data (line 49) | typedef struct {
type print_stats (line 68) | struct print_stats {
type print_stats (line 76) | struct print_stats
type f_uri_size (line 97) | struct f_uri_size {
type f_uri_size (line 102) | struct f_uri_size
type f_uri_size (line 103) | struct f_uri_size
function build_fsize (line 107) | void build_fsize ()
function get_f_size (line 160) | int get_f_size (char uri[URI_SIZE])
function print_header_line (line 195) | void
function print_call (line 224) | void
function call_stats_init (line 378) | void call_stats_init()
function get_index (line 416) | int get_index (Call * c)
function track_call_request (line 430) | void track_call_request(Call *c )
function track_call_response (line 489) | void track_call_response(Call * c, double response_start_time)
function track_call_reply (line 496) | void track_call_reply(Call * c, double transfer_time)
function process_call_timeout (line 562) | void process_call_timeout(Conn * c )
function print_call_stats (line 939) | void
function get_call_total_conn_time (line 967) | double get_call_total_conn_time( Call *cur_call )
FILE: benchmarks/media-streaming/client/files/videoperf/stat/print_reply.c
type Call_Private_Data (line 38) | typedef struct Call_Private_Data
function flush_print_buf (line 52) | static void
function print_buf (line 62) | static void
function print_request (line 111) | static void
function print_reply_hdr (line 146) | static void
function call_destroyed (line 176) | static void
function send_raw_data (line 190) | static void
function recv_raw_data (line 201) | static void
function recv_data (line 214) | static void
function recv_stop (line 227) | static void
function init (line 242) | static void
FILE: benchmarks/media-streaming/client/files/videoperf/stat/sess_stat.c
type Sess_Private_Data (line 66) | typedef struct Sess_Private_Data
function perf_sample (line 76) | static void
function sess_created (line 101) | static void
function sess_destroyed (line 113) | static void
function conn_connected (line 161) | static void
function call_done (line 175) | static void
function dump_stats (line 189) | static void
function init (line 233) | static void
function dump (line 265) | static void
FILE: benchmarks/media-streaming/client/files/videoperf/stat/spec_stats.c
type spec_file_data (line 56) | typedef struct {
type session_data (line 89) | typedef struct {
function spec_stats_init (line 103) | void spec_stats_init() {
function spec_hash (line 132) | int spec_hash( char * uri ) {
function get_spec_index (line 153) | int get_spec_index( Call * c ) {
function track_spec_request (line 187) | void track_spec_request(Call *c ) {
function track_spec_response (line 213) | void track_spec_response(Call * c, double response_start_time ) {
function track_spec_reply (line 224) | void track_spec_reply(Call * c, double transfer_time ) {
function track_spec_connection (line 251) | void track_spec_connection(Conn * c ) {
function process_spec_timeout (line 265) | void process_spec_timeout(Conn * c ) {
function print_spec_timeouts (line 313) | void print_spec_timeouts() {
function classify_uri (line 448) | int
function get_file_index (line 480) | int
FILE: benchmarks/media-streaming/client/files/videoperf/sys_sched_affinity.c
function sched_setaffinity_videoperf (line 8) | long
function sched_getaffinity_videoperf (line 15) | long
FILE: benchmarks/media-streaming/client/files/videoperf/timer.c
function done (line 46) | static void
function Time (line 54) | Time
function Time (line 63) | Time
function timer_init (line 69) | void
function timer_tick (line 78) | void
function Timer (line 115) | Timer*
function timer_cancel (line 184) | void
FILE: benchmarks/media-streaming/client/files/videoperf/timer.h
type Timer (line 34) | struct Timer
type Timer (line 35) | struct Timer
type Timer_Queue (line 37) | typedef struct Timer_Queue
type Timer (line 44) | typedef struct Timer
FILE: benchmarks/media-streaming/client/files/videoperf/ttest.c
function expire (line 34) | void
function main (line 46) | int
FILE: benchmarks/media-streaming/dataset/files/filegen/gen_fileset.c
function main (line 39) | int main(int argc, char *argv[])
function create_file (line 96) | static int create_file( char *fname, int size )
FILE: benchmarks/media-streaming/dataset/files/filegen/make_zipf.c
type logfile_info_struct (line 94) | typedef struct {
type fs_info_struct (line 131) | struct fs_info_struct
type file_info_struct (line 132) | typedef struct {
type fileset_info_struct (line 142) | typedef struct fs_info_struct {
type session_info_struct (line 154) | typedef struct {
function read_config (line 188) | void read_config()
function interpolate_cdf (line 234) | static double interpolate_cdf( double r, /* random number between 0...
function compute_duration (line 270) | static double compute_duration( double r )
function compute_session_frac (line 305) | static double compute_session_frac( double r )
function make_zipf_distribution (line 325) | static void make_zipf_distribution( double *sample, int num_ranks )
type rank_struct (line 347) | typedef struct {
function compare_rank_views (line 351) | static int compare_rank_views( const void *c1, const void *c2 )
function fileset_info_struct (line 359) | static fileset_info_struct *create_video_library( int lib_size )
function write_file_duration_CDF (line 484) | static void write_file_duration_CDF( void )
function create_random_ranks (line 506) | static void create_random_ranks( fileset_info_struct *fsi )
function fileset_info_struct (line 566) | static fileset_info_struct *read_video_library( const char *filename, lo...
function free_video_library (line 689) | static void free_video_library( fileset_info_struct *fsi )
function make_video_index (line 704) | static void make_video_index( fileset_info_struct *fsi )
function main (line 719) | int main(int argc, char *argv[])
type request_info_struct (line 1225) | typedef struct {
function compare_chunk_uses (line 1231) | static int compare_chunk_uses( const void *c1, const void *c2 )
function compare_file_numbers (line 1239) | static int compare_file_numbers( const void *c1, const void *c2 )
function compare_chunk_order (line 1247) | static int compare_chunk_order( const void *c1, const void *c2 )
function output_chunk_requests (line 1259) | static void output_chunk_requests( FILE *f, fileset_info_struct *fsi, in...
function create_log_files (line 1343) | static int create_log_files( session_info_struct *session_info, int tota...
FILE: benchmarks/media-streaming/dataset/files/filegen/video_gen.py
function bytes_to_MB (line 15) | def bytes_to_MB(number_of_bytes):
function generate_video_file_with_requested_size (line 23) | def generate_video_file_with_requested_size(requested_video_size_in_byte...
function get_resolution (line 41) | def get_resolution():
function getopts (line 51) | def getopts(argv):
function get_video_info (line 59) | def get_video_info():
function parse_videos_info (line 73) | def parse_videos_info(resolution,videos_path):
FILE: benchmarks/media-streaming/server/files/HTMLWebPlayer/js/helper.js
function populateVideosList (line 3) | function populateVideosList(selectedList) {
function changeVideo (line 47) | function changeVideo(videoSource, type) {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/CDL.java
class CDL (line 46) | public class CDL {
method getValue (line 55) | private static String getValue(JSONTokener x) throws JSONException {
method rowToJSONArray (line 95) | public static JSONArray rowToJSONArray(JSONTokener x) throws JSONExcep...
method rowToJSONObject (line 131) | public static JSONObject rowToJSONObject(JSONArray names, JSONTokener x)
method rowToString (line 144) | public static String rowToString(JSONArray ja) {
method toJSONArray (line 181) | public static JSONArray toJSONArray(String string) throws JSONException {
method toJSONArray (line 192) | public static JSONArray toJSONArray(JSONTokener x) throws JSONException {
method toJSONArray (line 204) | public static JSONArray toJSONArray(JSONArray names, String string)
method toJSONArray (line 217) | public static JSONArray toJSONArray(JSONArray names, JSONTokener x)
method toString (line 245) | public static String toString(JSONArray ja) throws JSONException {
method toString (line 265) | public static String toString(JSONArray names, JSONArray ja)
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/Cookie.java
class Cookie (line 33) | public class Cookie {
method escape (line 47) | public static String escape(String string) {
method toJSONObject (line 81) | public static JSONObject toJSONObject(String string) throws JSONExcept...
method toString (line 118) | public static String toString(JSONObject jo) throws JSONException {
method unescape (line 150) | public static String unescape(String string) {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/CookieList.java
class CookieList (line 34) | public class CookieList {
method toJSONObject (line 49) | public static JSONObject toJSONObject(String string) throws JSONExcept...
method toString (line 70) | public static String toString(JSONObject jo) throws JSONException {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/HTTP.java
class HTTP (line 34) | public class HTTP {
method toJSONObject (line 71) | public static JSONObject toJSONObject(String string) throws JSONExcept...
method toString (line 127) | public static String toString(JSONObject jo) throws JSONException {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/HTTPTokener.java
class HTTPTokener (line 33) | public class HTTPTokener extends JSONTokener {
method HTTPTokener (line 39) | public HTTPTokener(String string) {
method nextToken (line 49) | public String nextToken() throws JSONException {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/JSONArray.java
class JSONArray (line 80) | public class JSONArray implements Iterable<Object> {
method JSONArray (line 90) | public JSONArray() {
method JSONArray (line 102) | public JSONArray(JSONTokener x) throws JSONException {
method JSONArray (line 143) | public JSONArray(String source) throws JSONException {
method JSONArray (line 153) | public JSONArray(Collection<Object> collection) {
method JSONArray (line 169) | public JSONArray(Object array) throws JSONException {
method iterator (line 182) | @Override
method get (line 196) | public Object get(int index) throws JSONException {
method getBoolean (line 215) | public boolean getBoolean(int index) throws JSONException {
method getDouble (line 239) | public double getDouble(int index) throws JSONException {
method getInt (line 258) | public int getInt(int index) throws JSONException {
method getJSONArray (line 278) | public JSONArray getJSONArray(int index) throws JSONException {
method getJSONObject (line 296) | public JSONObject getJSONObject(int index) throws JSONException {
method getLong (line 314) | public long getLong(int index) throws JSONException {
method getString (line 333) | public String getString(int index) throws JSONException {
method isNull (line 348) | public boolean isNull(int index) {
method join (line 363) | public String join(String separator) throws JSONException {
method length (line 381) | public int length() {
method opt (line 392) | public Object opt(int index) {
method optBoolean (line 406) | public boolean optBoolean(int index) {
method optBoolean (line 421) | public boolean optBoolean(int index, boolean defaultValue) {
method optDouble (line 438) | public double optDouble(int index) {
method optDouble (line 453) | public double optDouble(int index, double defaultValue) {
method optInt (line 470) | public int optInt(int index) {
method optInt (line 485) | public int optInt(int index, int defaultValue) {
method optJSONArray (line 501) | public JSONArray optJSONArray(int index) {
method optJSONObject (line 515) | public JSONObject optJSONObject(int index) {
method optLong (line 529) | public long optLong(int index) {
method optLong (line 544) | public long optLong(int index, long defaultValue) {
method optString (line 561) | public String optString(int index) {
method optString (line 575) | public String optString(int index, String defaultValue) {
method put (line 588) | public JSONArray put(boolean value) {
method put (line 601) | public JSONArray put(Collection<Object> value) {
method put (line 615) | public JSONArray put(double value) throws JSONException {
method put (line 629) | public JSONArray put(int value) {
method put (line 641) | public JSONArray put(long value) {
method put (line 654) | public JSONArray put(Map<String, Object> value) {
method put (line 668) | public JSONArray put(Object value) {
method put (line 686) | public JSONArray put(int index, boolean value) throws JSONException {
method put (line 703) | public JSONArray put(int index, Collection<Object> value) throws JSONE...
method put (line 721) | public JSONArray put(int index, double value) throws JSONException {
method put (line 739) | public JSONArray put(int index, int value) throws JSONException {
method put (line 757) | public JSONArray put(int index, long value) throws JSONException {
method put (line 775) | public JSONArray put(int index, Map<String, Object> value) throws JSON...
method put (line 796) | public JSONArray put(int index, Object value) throws JSONException {
method remove (line 820) | public Object remove(int index) {
method similar (line 833) | public boolean similar(Object other) {
method toJSONObject (line 871) | public JSONObject toJSONObject(JSONArray names) throws JSONException {
method toString (line 893) | public String toString() {
method toString (line 913) | public String toString(int indentFactor) throws JSONException {
method write (line 929) | public Writer write(Writer writer) throws JSONException {
method write (line 946) | Writer write(Writer writer, int indentFactor, int indent)
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/JSONException.java
class JSONException (line 9) | public class JSONException extends RuntimeException {
method JSONException (line 19) | public JSONException(String message) {
method JSONException (line 27) | public JSONException(Throwable cause) {
method getCause (line 39) | @Override
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/JSONML.java
class JSONML (line 38) | public class JSONML {
method parse (line 49) | private static Object parse(
method toJSONArray (line 250) | public static JSONArray toJSONArray(String string) throws JSONException {
method toJSONArray (line 267) | public static JSONArray toJSONArray(XMLTokener x) throws JSONException {
method toJSONObject (line 285) | public static JSONObject toJSONObject(XMLTokener x) throws JSONExcepti...
method toJSONObject (line 303) | public static JSONObject toJSONObject(String string) throws JSONExcept...
method toString (line 314) | public static String toString(JSONArray ja) throws JSONException {
method toString (line 398) | public static String toString(JSONObject jo) throws JSONException {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/JSONObject.java
class JSONObject (line 96) | public class JSONObject {
class Null (line 102) | private static final class Null {
method clone (line 110) | @Override
method equals (line 123) | @Override
method toString (line 133) | public String toString() {
method JSONObject (line 154) | public JSONObject() {
method JSONObject (line 172) | public JSONObject(JSONObject jo, String[] names) {
method JSONObject (line 191) | public JSONObject(JSONTokener x) throws JSONException {
method JSONObject (line 245) | public JSONObject(Map<String, Object> map) {
method JSONObject (line 280) | public JSONObject(Object bean) {
method JSONObject (line 299) | public JSONObject(Object object, String names[]) {
method JSONObject (line 323) | public JSONObject(String source) throws JSONException {
method JSONObject (line 337) | public JSONObject(String baseName, Locale locale) throws JSONException {
method accumulate (line 389) | public JSONObject accumulate(String key, Object value) throws JSONExce...
method append (line 419) | public JSONObject append(String key, Object value) throws JSONException {
method doubleToString (line 441) | public static String doubleToString(double d) {
method get (line 470) | public Object get(String key) throws JSONException {
method getBoolean (line 491) | public boolean getBoolean(String key) throws JSONException {
method getDouble (line 516) | public double getDouble(String key) throws JSONException {
method getInt (line 537) | public int getInt(String key) throws JSONException {
method getJSONArray (line 557) | public JSONArray getJSONArray(String key) throws JSONException {
method getJSONObject (line 575) | public JSONObject getJSONObject(String key) throws JSONException {
method getLong (line 594) | public long getLong(String key) throws JSONException {
method getNames (line 610) | public static String[] getNames(JSONObject jo) {
method getNames (line 630) | public static String[] getNames(Object object) {
method getString (line 656) | public String getString(String key) throws JSONException {
method has (line 671) | public boolean has(String key) {
method increment (line 687) | public JSONObject increment(String key) throws JSONException {
method isNull (line 714) | public boolean isNull(String key) {
method keys (line 723) | public Iterator<String> keys() {
method keySet (line 732) | public Set<String> keySet() {
method length (line 741) | public int length() {
method names (line 752) | public JSONArray names() {
method numberToString (line 770) | public static String numberToString(Number number) throws JSONException {
method opt (line 798) | public Object opt(String key) {
method optBoolean (line 810) | public boolean optBoolean(String key) {
method optBoolean (line 825) | public boolean optBoolean(String key, boolean defaultValue) {
method optDouble (line 842) | public double optDouble(String key) {
method optDouble (line 857) | public double optDouble(String key, double defaultValue) {
method optInt (line 874) | public int optInt(String key) {
method optInt (line 889) | public int optInt(String key, int defaultValue) {
method optJSONArray (line 905) | public JSONArray optJSONArray(String key) {
method optJSONObject (line 918) | public JSONObject optJSONObject(String key) {
method optLong (line 932) | public long optLong(String key) {
method optLong (line 947) | public long optLong(String key, long defaultValue) {
method optString (line 964) | public String optString(String key) {
method optString (line 978) | public String optString(String key, String defaultValue) {
method populateMap (line 983) | private void populateMap(Object bean) {
method put (line 1040) | public JSONObject put(String key, boolean value) throws JSONException {
method put (line 1056) | public JSONObject put(String key, Collection<Object> value) throws JSO...
method put (line 1072) | public JSONObject put(String key, double value) throws JSONException {
method put (line 1088) | public JSONObject put(String key, int value) throws JSONException {
method put (line 1104) | public JSONObject put(String key, long value) throws JSONException {
method put (line 1120) | public JSONObject put(String key, Map<String, Object> value) throws JS...
method put (line 1139) | public JSONObject put(String key, Object value) throws JSONException {
method putOnce (line 1163) | public JSONObject putOnce(String key, Object value) throws JSONExcepti...
method putOpt (line 1187) | public JSONObject putOpt(String key, Object value) throws JSONException {
method quote (line 1204) | public static String quote(String string) {
method quote (line 1216) | public static Writer quote(String string, Writer w) throws IOException {
method remove (line 1283) | public Object remove(String key) {
method similar (line 1295) | public boolean similar(Object other) {
method stringToValue (line 1335) | public static Object stringToValue(String string) {
method testValidity (line 1388) | public static void testValidity(Object o) throws JSONException {
method toJSONArray (line 1415) | public JSONArray toJSONArray(JSONArray names) throws JSONException {
method toString (line 1438) | public String toString() {
method toString (line 1460) | public String toString(int indentFactor) throws JSONException {
method valueToString (line 1491) | public static String valueToString(Object value) throws JSONException {
method wrap (line 1542) | public static Object wrap(Object object) {
method write (line 1593) | public Writer write(Writer writer) throws JSONException {
method writeValue (line 1597) | static final Writer writeValue(Writer writer, Object value,
method indent (line 1634) | static final void indent(Writer writer, int indent) throws IOException {
method write (line 1649) | Writer write(Writer writer, int indentFactor, int indent)
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/JSONString.java
type JSONString (line 10) | public interface JSONString {
method toJSONString (line 17) | public String toJSONString();
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/JSONStringer.java
class JSONStringer (line 59) | public class JSONStringer extends JSONWriter {
method JSONStringer (line 63) | public JSONStringer() {
method toString (line 75) | public String toString() {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/JSONTokener.java
class JSONTokener (line 41) | public class JSONTokener {
method JSONTokener (line 57) | public JSONTokener(Reader reader) {
method JSONTokener (line 74) | public JSONTokener(InputStream inputStream) throws JSONException {
method JSONTokener (line 84) | public JSONTokener(String s) {
method back (line 94) | public void back() throws JSONException {
method dehexchar (line 111) | public static int dehexchar(char c) {
method end (line 124) | public boolean end() {
method more (line 134) | public boolean more() throws JSONException {
method next (line 149) | public char next() throws JSONException {
method next (line 188) | public char next(char c) throws JSONException {
method next (line 207) | public String next(int n) throws JSONException {
method nextClean (line 231) | public char nextClean() throws JSONException {
method nextString (line 252) | public String nextString(char quote) throws JSONException {
method nextTo (line 309) | public String nextTo(char delimiter) throws JSONException {
method nextTo (line 330) | public String nextTo(String delimiters) throws JSONException {
method nextValue (line 354) | public Object nextValue() throws JSONException {
method skipTo (line 401) | public char skipTo(char to) throws JSONException {
method syntaxError (line 432) | public JSONException syntaxError(String message) {
method toString (line 442) | public String toString() {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/JSONWriter.java
class JSONWriter (line 59) | public class JSONWriter {
method JSONWriter (line 96) | public JSONWriter(Writer w) {
method append (line 110) | private JSONWriter append(String string) throws JSONException {
method array (line 141) | public JSONWriter array() throws JSONException {
method end (line 158) | private JSONWriter end(char mode, char c) throws JSONException {
method endArray (line 180) | public JSONWriter endArray() throws JSONException {
method endObject (line 190) | public JSONWriter endObject() throws JSONException {
method key (line 202) | public JSONWriter key(String string) throws JSONException {
method object (line 234) | public JSONWriter object() throws JSONException {
method pop (line 254) | private void pop(char c) throws JSONException {
method push (line 275) | private void push(JSONObject jo) throws JSONException {
method value (line 292) | public JSONWriter value(boolean b) throws JSONException {
method value (line 302) | public JSONWriter value(double d) throws JSONException {
method value (line 312) | public JSONWriter value(long l) throws JSONException {
method value (line 324) | public JSONWriter value(Object object) throws JSONException {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/Property.java
class Property (line 36) | public class Property {
method toJSONObject (line 43) | public static JSONObject toJSONObject(java.util.Properties properties)...
method toProperties (line 61) | public static Properties toProperties(JSONObject jo) throws JSONExcep...
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/XML.java
class XML (line 35) | public class XML {
method escape (line 75) | public static String escape(String string) {
method noSpace (line 108) | public static void noSpace(String string) throws JSONException {
method parse (line 129) | private static boolean parse(XMLTokener x, JSONObject context,
method stringToValue (line 302) | public static Object stringToValue(String string) {
method toJSONObject (line 351) | public static JSONObject toJSONObject(String string) throws JSONExcept...
method toString (line 367) | public static String toString(Object object) throws JSONException {
method toString (line 379) | public static String toString(Object object, String tagName)
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/org/json/XMLTokener.java
class XMLTokener (line 33) | public class XMLTokener extends JSONTokener {
method XMLTokener (line 54) | public XMLTokener(String s) {
method nextCDATA (line 63) | public String nextCDATA() throws JSONException {
method nextContent (line 92) | public Object nextContent() throws JSONException {
method nextEntity (line 127) | public Object nextEntity(char ampersand) throws JSONException {
method nextMeta (line 154) | public Object nextMeta() throws JSONException {
method nextToken (line 219) | public Object nextToken() throws JSONException {
method skipPast (line 301) | public boolean skipPast(String to) throws JSONException {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/setup/UserGenerator.java
class UserGenerator (line 23) | public class UserGenerator {
method UserGenerator (line 31) | public UserGenerator(String host){
method updateElggTokenAndTs (line 36) | private void updateElggTokenAndTs(Pair<String, String> p, StringBuilde...
method loadProperties (line 52) | private void loadProperties() throws IOException {
method generateUsers (line 66) | private void generateUsers() throws Exception {
method createUsers (line 89) | private void createUsers() throws Exception {
method main (line 152) | public static void main(String[] args) throws Exception {
method writeUserFile (line 160) | private void writeUserFile() throws FileNotFoundException {
class RandomStringGenerator (line 217) | class RandomStringGenerator {
type Mode (line 219) | public static enum Mode {
method generateRandomString (line 223) | public static String generateRandomString(int length, Mode mode) throw...
class UserEntity (line 253) | class UserEntity {
method getDisplayName (line 261) | public String getDisplayName() {
method setDisplayName (line 264) | public void setDisplayName(String displayName) {
method getUserName (line 267) | public String getUserName() {
method setUserName (line 270) | public void setUserName(String userName) {
method getEmail (line 273) | public String getEmail() {
method setEmail (line 276) | public void setEmail(String email) {
method getPassword (line 279) | public String getPassword() {
method setPassword (line 282) | public void setPassword(String password) {
method getGuid (line 285) | public String getGuid() {
method setGuid (line 288) | public void setGuid(String guid) {
class Pair (line 294) | class Pair<E, F> {
method Pair (line 298) | Pair() {
method Pair (line 302) | Pair(E value1, F value2) {
method getValue1 (line 307) | public E getValue1() {
method setValue1 (line 310) | public void setValue1(E value1) {
method getValue2 (line 313) | public F getValue2() {
method setValue2 (line 316) | public void setValue2(F value2) {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/workload/driver/RandomStringGenerator.java
class RandomStringGenerator (line 3) | public class RandomStringGenerator {
type Mode (line 5) | public static enum Mode {
method generateRandomString (line 9) | public static String generateRandomString(int length, Mode mode)
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/workload/driver/UserPasswordPair.java
class UserPasswordPair (line 9) | public class UserPasswordPair {
method UserPasswordPair (line 15) | public UserPasswordPair(String guid, String userName, String password) {
method UserPasswordPair (line 21) | public UserPasswordPair() {
method getUserName (line 24) | public String getUserName() {
method setUserName (line 27) | public void setUserName(String userName) {
method getPassword (line 30) | public String getPassword() {
method setPassword (line 33) | public void setPassword(String password) {
method getGuid (line 37) | public String getGuid() {
method setGuid (line 41) | public void setGuid(String guid) {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/workload/driver/Web20Client.java
class Web20Client (line 13) | public class Web20Client {
type ClientState (line 33) | public enum ClientState {
method Web20Client (line 40) | public Web20Client() {
method getElggToken (line 44) | public String getElggToken() {
method setElggToken (line 48) | public void setElggToken(String elggToken) {
method getElggTs (line 52) | public String getElggTs() {
method setElggTs (line 56) | public void setElggTs(String elggTs) {
method getUsername (line 60) | public String getUsername() {
method setUsername (line 64) | public void setUsername(String username) {
method getPassword (line 68) | public String getPassword() {
method setPassword (line 72) | public void setPassword(String password) {
method getHttp (line 76) | public HttpTransport getHttp() {
method setHttp (line 80) | public void setHttp(HttpTransport http) {
method getGuid (line 84) | public String getGuid() {
method setGuid (line 88) | public void setGuid(String guid) {
method getEmail (line 92) | public String getEmail() {
method setEmail (line 96) | public void setEmail(String email) {
method getClientState (line 100) | public ClientState getClientState() {
method setClientState (line 104) | public void setClientState(ClientState clientState) {
method isLoggedIn (line 108) | public boolean isLoggedIn() {
method setLoggedIn (line 112) | public void setLoggedIn(boolean loggedIn) {
method getNumActivities (line 116) | public String getNumActivities() {
method setNumActivities (line 120) | public void setNumActivities(String numActivities) {
method addFriendsList (line 124) | public void addFriendsList(String guid){
method removeFriendsList (line 128) | public void removeFriendsList(String guid){
method setFriendsList (line 132) | public void setFriendsList(List<String> friendsList){
method getFriendsList (line 136) | public String getFriendsList(int index){
method getFriendsListSize (line 140) | public int getFriendsListSize(){
method setMessagesGuids (line 144) | public void setMessagesGuids(List<String> messages_guids){
method getMessagesGuidsSize (line 148) | public int getMessagesGuidsSize(){
method getMessagesGuids (line 152) | public String getMessagesGuids(int index){
method removeMessagesGuids (line 156) | public void removeMessagesGuids(String item){
method setBlogsGuids (line 160) | public void setBlogsGuids(List<String> blogs_guids){
method getBlogsGuidsSize (line 164) | public int getBlogsGuidsSize(){
method getBlogsGuids (line 168) | public String getBlogsGuids(int index){
method setWiresGuids (line 172) | public void setWiresGuids(List<String> wires_guids){
method getWiresGuidsSize (line 176) | public int getWiresGuidsSize(){
method getWiresGuids (line 180) | public String getWiresGuids(int index){
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/workload/driver/Web20Driver.java
class Web20Driver (line 51) | @BenchmarkDefinition(
method Web20Driver (line 166) | public Web20Driver() throws SecurityException, IOException, XPathExpre...
method getRandomUserGUID (line 222) | private String getRandomUserGUID() {
method getRandomUser (line 232) | private UserPasswordPair getRandomUser() {
method updateElggTokenAndTs (line 240) | private void updateElggTokenAndTs(Web20Client client, StringBuilder sb...
method search (line 276) | @BenchmarkOperation(name = "Search",
method sentMessages (line 322) | @BenchmarkOperation(name = "SentMessages",
method comment (line 365) | @BenchmarkOperation(name = "Comment",
method replyWire (line 415) | @BenchmarkOperation(name = "ReplyWire",
method doLike (line 464) | @BenchmarkOperation(name = "Like",
method deleteMessage (line 522) | @BenchmarkOperation(name = "DeleteMessage",
method readMessage (line 575) | @BenchmarkOperation(name = "ReadMessage",
method checkFriends (line 631) | @BenchmarkOperation(name = "CheckFriends",
method checkProfile (line 674) | @BenchmarkOperation(name = "CheckProfile",
method inbox (line 719) | @BenchmarkOperation(name = "Inbox",
method Dashboard (line 774) | @BenchmarkOperation(name = "Dashboard",
method CheckBlog (line 813) | @BenchmarkOperation(name = "CheckBlog",
method CheckWire (line 876) | @BenchmarkOperation(name = "CheckWire",
method CheckActivity (line 935) | @BenchmarkOperation(name = "CheckActivity",
method browseToElgg (line 980) | @BenchmarkOperation(name = "BrowsetoElgg",
method getNotifications (line 1043) | @BenchmarkOperation(name = "GetNotifications",
method sendMessage (line 1083) | @BenchmarkOperation(name = "SendMessage",
method postBlog (line 1129) | @BenchmarkOperation(name = "PostBlog",
method postWire (line 1191) | @BenchmarkOperation(name = "PostWire",
method accessHomePage (line 1242) | @BenchmarkOperation(name = "AccessHomePage",
method doLogin (line 1282) | @BenchmarkOperation(name = "DoLogin",
method removeFriend (line 1359) | @BenchmarkOperation(name = "RemoveFriend",
method addFriend (line 1422) | @BenchmarkOperation(name = "AddFriend",
method logout (line 1479) | @BenchmarkOperation(name = "Logout",
method register (line 1523) | @BenchmarkOperation(name = "Register",
method printErrorMessageIfAny (line 1601) | private void printErrorMessageIfAny(StringBuilder sb, String postReque...
class ElggDriverMetrics (line 1618) | static class ElggDriverMetrics implements CustomMetrics {
method add (line 1653) | @Override
method getResults (line 1691) | @Override
method clone (line 1819) | public Object clone() {
FILE: benchmarks/web-serving/faban_client/files/web20_benchmark/src/workload/harness/ElggBenchmark.java
class ElggBenchmark (line 13) | public class ElggBenchmark extends DefaultFabanBenchmark2 {
method prerun (line 24) | @PreRun public void prerun() throws Exception {
FILE: commons/hadoop/2.10.2/files/hadoop-start.py
function get_ip (line 4) | def get_ip():
FILE: commons/hadoop/3.3.4/files/hadoop-start.py
function get_ip (line 4) | def get_ip():
Copy disabled (too large)
Download .json
Condensed preview — 356 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,887K chars).
[
{
"path": ".github/scripts/build-images.sh",
"chars": 2997,
"preview": "#!/bin/bash\n\n# @authors: Somya Arora, Arash Pourhabibi\n# @modified: Shanqing Lin, Ali Ansari\n\n\n# 1. Figure out the modif"
},
{
"path": ".github/workflows/build-images.yaml",
"chars": 17414,
"preview": "name: build-and-push-docker-image\non: \n push:\n branches:\n - main\n - dev\n pull_request:\n branches:\n "
},
{
"path": ".github/workflows/spell-check.yaml",
"chars": 345,
"preview": "on: \n push:\n branches:\n - main\n - dev\n pull_request:\n branches:\n - main\n - dev\njobs:\n spell"
},
{
"path": ".gitignore",
"chars": 10,
"preview": ".DS_Store\n"
},
{
"path": ".spellcheck.yml",
"chars": 432,
"preview": "matrix:\n - name: md source\n aspell:\n lang: en\n d: en_US\n ignore-case: true\n mode: html\n defau"
},
{
"path": ".wordlist.txt",
"chars": 1203,
"preview": "ALS\nanalytical\nanalytics\nbackend\nbalancer\nbasedocker\nbenchmarked\nbenchmarking\nBuildKit\nbuildkitd\nbuildx\ncassandra\ncd\nCLI"
},
{
"path": "LICENSE.md",
"chars": 3200,
"preview": "CloudSuite consists of several software components that are governed by various licensing terms, in addition to software"
},
{
"path": "README.md",
"chars": 2428,
"preview": "# CloudSuite 4.0 #\n\n**This branch contains the release of CloudSuite v4.0. If you are looking for CloudSuite 3, please c"
},
{
"path": "benchmarks/data-analytics/latest/Dockerfile",
"chars": 639,
"preview": "FROM cloudsuite/hadoop:2.10.2\n\nENV MAHOUT_VERSION 14.1\nENV MAHOUT_HOME /opt/mahout-${MAHOUT_VERSION}\nRUN mkdir ${MAHOUT_"
},
{
"path": "benchmarks/data-analytics/latest/files/benchmark.sh",
"chars": 1545,
"preview": "#!/bin/bash\n\nRED='\\033[0;31m'\nRESET='\\033[0m'\n\nsource ~/.bashrc\necho -e \"Mahout: Start HDFS server\"\n${HADOOP_HOME}/bin/h"
},
{
"path": "benchmarks/data-analytics/latest/files/categories",
"chars": 205,
"preview": "Art\nCulture\nEconomics\nEducation\nEvent\nHealth \nHistory\nIndustry\nSports\nGeography\nCities\nCountries\nLanguage\nLaw\nMedia\nNatu"
},
{
"path": "benchmarks/data-analytics/latest/files/docker-entrypoint.py",
"chars": 566,
"preview": "#!/usr/bin/env python3\n\nimport os\nimport sys\nimport subprocess\nimport argparse\n\nargs = sys.argv[1:]\nparser = argparse.Ar"
},
{
"path": "benchmarks/data-caching/client/Dockerfile",
"chars": 975,
"preview": "FROM cloudsuite/base-os:ubuntu\n\n# add our user and group first to make sure their IDs get assigned consistently, regardl"
},
{
"path": "benchmarks/data-caching/client/docker-entrypoint.sh",
"chars": 2322,
"preview": "#!/bin/bash\n\nARGS=()\nMODE=\"bash\"\nSCALE=30\nWORKERS=4\nSERVER_MEMORY=4096\nINTERVAL=1\nGET_RATIO=0.8\nCONNECTION=200\nRPS=10000"
},
{
"path": "benchmarks/data-caching/server/Dockerfile",
"chars": 133,
"preview": "FROM cloudsuite/memcached:1.6.15\n\n# the entry point is set to memcached in the base image\nCMD [\"-t\", \"2\", \"-m\", \"2048\", "
},
{
"path": "benchmarks/data-serving/.gitignore",
"chars": 3,
"preview": "*~\n"
},
{
"path": "benchmarks/data-serving/client/Dockerfile",
"chars": 472,
"preview": "FROM cloudsuite/cassandra:4.1.0\n\nENV YCSB_VERSION 0.17.0\n\n\nRUN wget -q --show-progress --progress=bar:force https://gith"
},
{
"path": "benchmarks/data-serving/client/load.sh",
"chars": 927,
"preview": "#!/bin/bash\n\n# Usage: load.sh <server_ip> <record_count> <target_load> <threads=1> <operation_count=load * 60>\n\nif [ $# "
},
{
"path": "benchmarks/data-serving/client/setup_tables.txt",
"chars": 400,
"preview": "create keyspace if not exists ycsb\n WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor': 3 };\nuse yc"
},
{
"path": "benchmarks/data-serving/client/warmup.sh",
"chars": 1506,
"preview": "#!/bin/bash\n\n# This script helps to fill the server database with given data set size. \n# Usage: warmup.sh <server_ip> <"
},
{
"path": "benchmarks/data-serving/server/Dockerfile",
"chars": 234,
"preview": "FROM cloudsuite/cassandra:4.1.0\n\nRUN apt update && apt install -y --no-install-recommends python3-yaml && rm -rf /var/li"
},
{
"path": "benchmarks/data-serving/server/README.md",
"chars": 1034,
"preview": "# Cassandra Server #\n\n## Single Node\nCheck the configuration parameters: conf/cassandra.yaml contains default values for"
},
{
"path": "benchmarks/data-serving/server/docker-entrypoint.py",
"chars": 3765,
"preview": "#!/usr/bin/env python3\n\nimport socket\ndef get_ip():\n s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n s.setti"
},
{
"path": "benchmarks/data-serving-relational/client/Dockerfile",
"chars": 767,
"preview": "FROM cloudsuite/base-os:ubuntu\n\nENV DEBIAN_FRONTEND noninteractive\n\n\n# 1. install necessary software (sysbench)\nRUN apt "
},
{
"path": "benchmarks/data-serving-relational/client/docker-entrypoint.py",
"chars": 2428,
"preview": "#!/usr/bin/env python3\n\nimport os\nimport sys\nimport subprocess\nimport argparse\n\nargs = sys.argv[1:]\nparser = argparse.Ar"
},
{
"path": "benchmarks/data-serving-relational/client/template/database.conf",
"chars": 122,
"preview": "db-driver=pgsql\npgsql-host=128.178.116.117\npgsql-port=5432\npgsql-user=cloudsuite\npgsql-password=cloudsuite\npgsql-db=sbte"
},
{
"path": "benchmarks/data-serving-relational/client/template/oltp-rw.py",
"chars": 2277,
"preview": "#!/usr/bin/env python3\n\nimport os\nimport sys\nimport subprocess\nimport argparse\n\n# According to the code, the table struc"
},
{
"path": "benchmarks/data-serving-relational/client/template/tpcc.py",
"chars": 1672,
"preview": "#!/usr/bin/env python3\n\nimport os\nimport sys\nimport subprocess\nimport argparse\n\nparser = argparse.ArgumentParser()\nparse"
},
{
"path": "benchmarks/data-serving-relational/server/Dockerfile",
"chars": 385,
"preview": "FROM cloudsuite/postgresql:15\n\n# Install sudo for user switching\nRUN apt update && apt install sudo python3 -y\n\n# Make t"
},
{
"path": "benchmarks/data-serving-relational/server/docker-entrypoint.py",
"chars": 3066,
"preview": "#!/usr/bin/env python3\n\nimport socket\ndef get_ip():\n s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n s.setti"
},
{
"path": "benchmarks/graph-analytics/latest/Dockerfile",
"chars": 1693,
"preview": "FROM --platform=linux/amd64 cloudsuite/spark:3.3.2 as build\n\nWORKDIR /root\n \n# Copy files\nCOPY benchmark /root/bench"
},
{
"path": "benchmarks/graph-analytics/latest/benchmark/build.sbt",
"chars": 374,
"preview": "name := \"Graph Analytics\"\n\nversion := \"2.0\"\n\norganization := \"PARSA\"\n\nscalaVersion := \"2.13.10\"\n\nartifactName := { (sv: "
},
{
"path": "benchmarks/graph-analytics/latest/benchmark/run_benchmark.sh",
"chars": 629,
"preview": "#!/usr/bin/env bash\n\nread -r -d '' USAGE << EOS\nUsage: graph-analytics [SPARK_OPTIONS]\n SPARK_OPTIONS are passed on to "
},
{
"path": "benchmarks/graph-analytics/latest/benchmark/src/main/scala/GraphAnalytics.scala",
"chars": 1831,
"preview": "import java.io.File\nimport scala.io.Source\n\n/* Graph analytics */\nimport org.apache.spark._\nimport org.apache.spark.grap"
},
{
"path": "benchmarks/graph-analytics/latest/files/entrypoint.sh",
"chars": 54,
"preview": "#!/usr/bin/env bash\n\nexec /root/run_benchmark.sh \"$@\"\n"
},
{
"path": "benchmarks/in-memory-analytics/latest/Dockerfile",
"chars": 1540,
"preview": "FROM --platform=linux/amd64 cloudsuite/spark:3.3.2 as build\n\nWORKDIR /root\n\n# Benchmark files\nCOPY movielens-als /root/m"
},
{
"path": "benchmarks/in-memory-analytics/latest/files/entrypoint.sh",
"chars": 55,
"preview": "#!/usr/bin/env bash\n\nexec /root/run_benchmark.sh \"$@\"\n\n"
},
{
"path": "benchmarks/in-memory-analytics/latest/files/spark-defaults.conf",
"chars": 1293,
"preview": "#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements. See the NOTICE"
},
{
"path": "benchmarks/in-memory-analytics/latest/files/spark-env.sh",
"chars": 6250,
"preview": "#!/usr/bin/env bash "
},
{
"path": "benchmarks/in-memory-analytics/latest/movielens-als/build.sbt",
"chars": 418,
"preview": "name := \"movielens-als\"\n\nversion := \"2.0\"\n\norganization := \"PARSA\"\n\nscalaVersion := \"2.13.10\"\n\nartifactName := { (sv: Sc"
},
{
"path": "benchmarks/in-memory-analytics/latest/movielens-als/run_benchmark.sh",
"chars": 580,
"preview": "#!/usr/bin/env bash\n\nread -r -d '' USAGE << EOS\nUsage: in-memory-analytics DATASET RATINGS [SPARK_OPTIONS]\n\n DATASET is"
},
{
"path": "benchmarks/in-memory-analytics/latest/movielens-als/src/main/scala/MovieLensALS.scala",
"chars": 6140,
"preview": "import java.io.File\n\nimport scala.io.Source\n\nimport org.apache.log4j.Logger\nimport org.apache.log4j.Level\n\nimport org.ap"
},
{
"path": "benchmarks/media-streaming/client/Dockerfile",
"chars": 562,
"preview": "FROM cloudsuite/base-os:ubuntu\n\nRUN apt-get update \\\n && apt-get install -y --no-install-recommends \\\n bc \\\n bu"
},
{
"path": "benchmarks/media-streaming/client/files/docker-entrypoint.sh",
"chars": 335,
"preview": "#!/bin/bash\nset -e\n\n# $1: the IP of the server\n# $2: the number of httperf clients\n# $3: the total number of sessions\n# "
},
{
"path": "benchmarks/media-streaming/client/files/run/benchmark.sh",
"chars": 498,
"preview": "#!/bin/bash\n\nserver_ip=$1\nnum_clients_per_machine=${2:-4}\nnum_sessions=${3:-100}\nrate=${4:-10}\nmode=${5:-TLS}\n\nstreaming"
},
{
"path": "benchmarks/media-streaming/client/files/run/hostlist.client",
"chars": 10,
"preview": "localhost\n"
},
{
"path": "benchmarks/media-streaming/client/files/run/hostlist.server",
"chars": 17,
"preview": "streaming_server\n"
},
{
"path": "benchmarks/media-streaming/client/files/run/peak_hunter/launch_hunt_bin.sh",
"chars": 2023,
"preview": "#!/bin/bash\n\nvideoServerIp=\"$1\"\nhostFileName=\"$2\" \nremoteOutputPath=\"$3\"\nnumClientsPerHost=\"$4\"\ntotalNumSessions=\"$5\"\nr"
},
{
"path": "benchmarks/media-streaming/client/files/run/peak_hunter/launch_remote.sh",
"chars": 1331,
"preview": "#!/bin/bash\n\nvideoServerIp=\"$1\"\nhostFileName=\"$2\"\nremoteOutputPath=\"$3\"\nnumClientsPerHost=\"$4\"\nnumSessions=\"$5\"\nrate=\"$6"
},
{
"path": "benchmarks/media-streaming/client/files/run/process_logs.sh",
"chars": 1290,
"preview": "#!/bin/bash\n\noutput_dir=${1:-/output}\n\nnFiles=0\nnRequests=0\nnReplies=0\nreplyRateAcc=0\nreplyTimeAcc=0\nnetIOAcc=0\n\nfor res"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/AUTHORS",
"chars": 145,
"preview": "David Mosberger\t\t(main sources)\nMartin Arlitt\t\t(SSL support)\nStephane Eranian\t(wlog URI generator)\nRichard Carter\t\t(wses"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/COPYRIGHT",
"chars": 18007,
"preview": "\t\t GNU GENERAL PUBLIC LICENSE\n\t\t Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc."
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/ChangeLog",
"chars": 26843,
"preview": "2012-10-30 Tim Brecht <brecht@cs.uwaterloo.ca>\n * Version 0.8.6b and 0.8.6c\n * Removed some debugging st"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/Makefile",
"chars": 3012,
"preview": "# Generated automatically from Makefile.in by configure.\nSHELL=/bin/sh\r\n\r\nsrcdir = .\r\ntop_srcdir = .\r\ntop_builddir = .\r\n"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/Makefile.in",
"chars": 2940,
"preview": "SHELL=/bin/sh\r\n\r\nVPATH = @srcdir@\r\nsrcdir = @srcdir@\r\ntop_srcdir = @top_srcdir@\r\ntop_builddir = .\r\n\r\nprefix = @prefix@\r\n"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/NEWS",
"chars": 2129,
"preview": "-*-Mode: outline-*-\n\n\f\n* New in version 0.8:\n\n** httperf is now released under the GNU General Public License (GPL).\n\n**"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/README",
"chars": 17382,
"preview": "-*-Mode: outline-*-\n\n* Building httperf\n\nThis release of httperf is using the standard GNU configuration\nmechanism. The"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/README.UW/README.CALL_STATS",
"chars": 3669,
"preview": "OVERVIEW\n--------\ncall_stats is a statistics module in httperf. The purpose of this\nmodule is to gather statistics on a "
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/README.UW/README.DYNOUT",
"chars": 898,
"preview": "The DYNOUT feature allows the timeout to be set separately for\neach request.\n\nIt is set by adding a timeout specificatio"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/README.UW/README.NO_RATE_HANG",
"chars": 6253,
"preview": "The Problem:\n\t1)a connection times out\n\t2)core.c conn_timeout is called by the timer\n\t3)this function signals the EV_CON"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/README.UW/README.STABLE_STATS",
"chars": 1736,
"preview": "The STABLE_STATS feature defines a ramp-up and ramp-down time for\nan experiment. Sessions that start before the ramp-up"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/README.UW/README.STAGGER_START",
"chars": 1380,
"preview": "The --stagger-start option causes httperf to start multiple httperf clients\nat slightly different times to avoid burstin"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/README.UW/README.TIMEOUT",
"chars": 9823,
"preview": "High Level Overview:\n\n\tNotation:\n\t\tT is the value --timeout=T\n\n\tA connection must be established in T seconds or the cli"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/README.UW/README.WSESSLOG",
"chars": 2111,
"preview": "The log file specified by the --wsesslog option is used to generate\nthe workload created by httperf. This log file consi"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/README.UW/man-call_stats.txt",
"chars": 4883,
"preview": "Examples of httperf used with call stats:\n\nhttperf --port=6800 --num-calls=4 --num-conns=2 --uri=/docs/10K.txt --call-st"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/README.WINDOWS",
"chars": 2468,
"preview": "\nThu Apr 17 12:12:51 2003\nTim Brecht\n\nI was able to produce a version of httperf that\nlooks like it can be run on Windo"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/TBB-NEW",
"chars": 330,
"preview": "\nWorking on code Adam did for\nhandling headers (including range requests).\n\nThink about making this code selectable via "
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/TODO",
"chars": 2560,
"preview": "Wed Oct 17 10:15:25 EDT 2012\n\nUW\n\n- Long term: add ability to specify start_conn_num and end_conn_num\n for stable stats"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/aclocal.m4",
"chars": 328,
"preview": "AC_DEFUN(AC_TYPE_LONG_LONG,\n[AC_CACHE_CHECK(for long long type, ac_cv_type_long_long,\n [AC_TRY_COMPILE(, [unsigned long"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/bt2line",
"chars": 326,
"preview": "#!/bin/bash\n\nif [ $# -ne 1 ] ; then\n echo \"Usage: $0 executable\"\n exit\nfi\n\nexecutable=$1\n\nwhile read line ; do\n addr="
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/call.c",
"chars": 2308,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribut"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/call.h",
"chars": 4647,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribut"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/config.cache",
"chars": 2900,
"preview": "# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared betw"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/config.guess",
"chars": 35954,
"preview": "#! /bin/sh\n# Attempt to guess a canonical system name.\n# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/config.h",
"chars": 3481,
"preview": "/* config.h. Generated automatically by configure. */\n/* config.h.in. Generated automatically from configure.in by au"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/config.h.in",
"chars": 3264,
"preview": "/* config.h.in. Generated automatically from configure.in by autoheader. */\n\n/* Define if using alloca.c. */\n#undef C"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/config.log",
"chars": 2259,
"preview": "This file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mis"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/config.status",
"chars": 13794,
"preview": "#! /bin/sh\n# Generated automatically by configure.\n# Run this file to recreate the current configuration.\n# This directo"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/config.sub",
"chars": 26571,
"preview": "#! /bin/sh\n# Configuration validation subroutine script, version 1.1.\n# Copyright (C) 1992, 1993, 1994, 1995, 1996, 19"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/configure",
"chars": 83352,
"preview": "#! /bin/sh\n\n# Guess values for system-dependent variables and create Makefiles.\n# Generated automatically using autoconf"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/configure.in",
"chars": 1789,
"preview": "dnl Process this file with autoconf to produce a configure script.\nAC_INIT(timer.h)\nAC_CONFIG_HEADER(config.h)\n\nAC_ARG_E"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/conn.c",
"chars": 2705,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/conn.h",
"chars": 3944,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribut"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/core.c",
"chars": 39692,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribut"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/core.h",
"chars": 1889,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/core_connect",
"chars": 664,
"preview": "# This viminfo file was generated by Vim 7.4.\n# You may edit it if you're careful!\n\n# Value of 'encoding' when this file"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/event.c",
"chars": 3283,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/event.h",
"chars": 2203,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/Makefile",
"chars": 1353,
"preview": "# Generated automatically from Makefile.in by configure.\nSHELL=/bin/sh\n\nsrcdir = .\ntop_srcdir = ..\ntop_builddir = ..\n\npr"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/Makefile.in",
"chars": 1279,
"preview": "SHELL=/bin/sh\n\nVPATH = @srcdir@\nsrcdir = @srcdir@\ntop_srcdir = @top_srcdir@\ntop_builddir = ..\n\nprefix = @prefix@\nbindir "
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/call_seq.c",
"chars": 3192,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/conn_rate.c",
"chars": 2007,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/misc.c",
"chars": 3293,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/rate.c",
"chars": 6242,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/rate.h",
"chars": 1536,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/sess_cookie.c",
"chars": 5565,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/session.c",
"chars": 12248,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribut"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/session.h",
"chars": 2008,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/uri_fixed.c",
"chars": 1601,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/uri_wlog.c",
"chars": 4565,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/uri_wset.c",
"chars": 3287,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/videosesslog.c",
"chars": 35456,
"preview": "\n/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribu"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/videosesslog.h",
"chars": 2301,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/wsess.c",
"chars": 5356,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/gen/wsesspage.c",
"chars": 12813,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/http.c",
"chars": 12029,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribut"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/http.h",
"chars": 1171,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/httperf.c",
"chars": 45052,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribut"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/httperf.h",
"chars": 8048,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribut"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/httperf.man",
"chars": 41264,
"preview": ".TH httperf 1 \"30 Oct 2000\"\n.IX httperf\n.SH NAME\nhttperf \\- HTTP performance measurement tool\n.SH SYNOPSIS\n.B httperf\n.R"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/idleconn.c",
"chars": 4827,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/install-sh",
"chars": 5598,
"preview": "#!/bin/sh\n#\n# install - install a program, script, or datafile\n# This comes from X11R5 (mit/util/scripts/install.sh).\n#\n"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/lib/COPYING.txt",
"chars": 250,
"preview": "FILE QUARANTINED\r\n\r\nMicrosoft Forefront Protection for Exchange Server (edge1) removed a file since it was found to matc"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/lib/Makefile",
"chars": 905,
"preview": "# Generated automatically from Makefile.in by configure.\nSHELL=/bin/sh\n\ntop_srcdir = ..\ntop_builddir = ..\n\nprefix = /usr"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/lib/Makefile.in",
"chars": 824,
"preview": "SHELL=/bin/sh\n\nVPATH = @srcdir@\ntop_srcdir = @top_srcdir@\ntop_builddir = ..\n\nprefix = @prefix@\nbindir = @bindir@\nmandir "
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/lib/README",
"chars": 257,
"preview": "This directory contains library-replacement functions that are needed\non some platforms. This code is copyright by the "
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/lib/getopt.c",
"chars": 24301,
"preview": "/* Getopt for GNU.\n NOTE: getopt is now part of the C library, so if you don't know what\n \"Keep this file name-space"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/lib/getopt.h",
"chars": 4632,
"preview": "/* Declarations for getopt.\n Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc.\n\nThis file is part "
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/lib/getopt1.c",
"chars": 4477,
"preview": "/* getopt_long and getopt_long_only entry points for GNU getopt.\n Copyright (C) 1987, 88, 89, 90, 91, 92, 1993, 1994\n\t"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/lib/ssl_writev.c",
"chars": 2354,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/mkinstalldirs",
"chars": 730,
"preview": "#! /bin/sh\n# mkinstalldirs --- make directory hierarchy\n# Author: Noah Friedman <friedman@prep.ai.mit.edu>\n# Created: 19"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/notes.txt",
"chars": 879,
"preview": "Timer info can be found looking for timer_now()\n\nParameters for figuring out if a connection should be counted:\n\n1. test"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/object.c",
"chars": 3570,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/object.h",
"chars": 2220,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/out_1080p_0.txt",
"chars": 56,
"preview": "-bash: ../build_orig/httperf: No such file or directory\n"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/output.log",
"chars": 1471,
"preview": "\nTotal: connections 100 requests 1547 replies 1547 test-duration 204.918 s\nNumber of connected connections is currently "
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/run-httperf",
"chars": 344,
"preview": "#!/bin/csh\nbuild-linux/httperf --verbose --timeout=2 --client=0/12 --server=192.168.41.110 --port=6800 --uri=/test/ --ra"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/sess.c",
"chars": 1433,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/sess.h",
"chars": 2271,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribut"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/stat/Makefile",
"chars": 1493,
"preview": "# Generated automatically from Makefile.in by configure.\nSHELL=/bin/sh\n\nsrcdir = .\ntop_srcdir = ..\ntop_builddir = ..\n\npr"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/stat/Makefile.in",
"chars": 1419,
"preview": "SHELL=/bin/sh\n\nVPATH = @srcdir@\nsrcdir = @srcdir@\ntop_srcdir = @top_srcdir@\ntop_builddir = ..\n\nprefix = @prefix@\nbindir "
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/stat/basic.c",
"chars": 47595,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribut"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/stat/call_stats.c",
"chars": 22701,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/stat/call_stats.h",
"chars": 1828,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/stat/print_reply.c",
"chars": 6642,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/stat/sess_stat.c",
"chars": 8312,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contribut"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/stat/spec_stats.c",
"chars": 17559,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/stat/spec_stats.h",
"chars": 2039,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/stat/stats.h",
"chars": 1226,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/sys_sched_affinity.c",
"chars": 456,
"preview": "#ifdef HAVE_SCHED_AFFINITY\n#ifdef __linux__\n\n#include <unistd.h>\n#include <sys/syscall.h>\n\n\nlong\nsched_setaffinity_video"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/sys_sched_affinity.h",
"chars": 393,
"preview": "#ifndef SYS_SCHED_AFFINITY_H\n#define SYS_SCHED_AFFINITY_H\n\n#ifdef HAVE_SCHED_AFFINITY\n#ifdef __linux__\n\nextern long sche"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/tags",
"chars": 91412,
"preview": "!_TAG_FILE_FORMAT\t2\t/extended format; --format=1 will not append ;\" to lines/\n!_TAG_FILE_SORTED\t1\t/0=unsorted, 1=sorted,"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/timeout",
"chars": 443,
"preview": "./README.UW/README.TIMEOUT: if (s->recvq && (timeout == 0.0 || timeout > s->recvq->timeout))\n./README.UW/README.TIMEOUT"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/timer.c",
"chars": 4292,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/timer.h",
"chars": 1791,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/client/files/videoperf/ttest.c",
"chars": 1819,
"preview": "/*\n httperf -- a tool for measuring web server performance\n Copyright (C) 2000 Hewlett-Packard Company\n Contri"
},
{
"path": "benchmarks/media-streaming/dataset/Dockerfile",
"chars": 1513,
"preview": "FROM cloudsuite/base-os:ubuntu\n\nENV DEBIAN_FRONTEND noninteractive\n\nRUN apt-get update && apt-get install make wget buil"
},
{
"path": "benchmarks/media-streaming/dataset/bootstrap.sh",
"chars": 467,
"preview": "#!/bin/bash\nDIR=\"/videos\"\nLIBRARY_SIZE=$1\nSESSIONS_SIZE=$2\n\nif [[ ( ! -z $FORCE && $FORCE == \"true\" ) ]]; then\n r"
},
{
"path": "benchmarks/media-streaming/dataset/files/download_video_files.sh",
"chars": 627,
"preview": "#!/bin/sh\n\nmkdir -p /root/VideoSet\ncd /root/VideoSet\n\nmkdir -p 240p; cd 240p\nfor i in `seq 1 9`\ndo\n curl -O https://c"
},
{
"path": "benchmarks/media-streaming/dataset/files/filegen/Makefile",
"chars": 199,
"preview": "CC = gcc\nCFLAGS = -Wall -g\nLIBS = -lm\n\nall: make_zipf gen_fileset\n\n.PHONY: all\n\nmake_zipf: make_zipf.c\n\t$(CC) $(CFLAGS) "
},
{
"path": "benchmarks/media-streaming/dataset/files/filegen/gen_fileset.c",
"chars": 3844,
"preview": "/*\n gen_fileset\n Creates a full set of video files using the contents of video_files.txt\n \n This file "
},
{
"path": "benchmarks/media-streaming/dataset/files/filegen/generate_video_files_and_logs.sh",
"chars": 2036,
"preview": "#!/bin/bash\n\nVIDEOS_DIR=$1\nVIDEO_SET=$2\nLIBRARY_SIZE=$3\nSESSIONS_SIZE=$4\n\nmkdir -p \"$VIDEOS_DIR/logs\"\ntouch \"$VIDEOS_DIR"
},
{
"path": "benchmarks/media-streaming/dataset/files/filegen/make_zipf.c",
"chars": 55500,
"preview": "/*\n make_zipf\n Creates a set of log files with zipf distribution.\n \n This file is Copyright (C) 2011 "
},
{
"path": "benchmarks/media-streaming/dataset/files/filegen/params/240p",
"chars": 70,
"preview": "library_size=10\nnum_log_files=1\nnum_log_sessions=5\nvideo_quality=240p\n"
},
{
"path": "benchmarks/media-streaming/dataset/files/filegen/params/360p",
"chars": 70,
"preview": "library_size=10\nnum_log_files=1\nnum_log_sessions=5\nvideo_quality=360p\n"
},
{
"path": "benchmarks/media-streaming/dataset/files/filegen/params/480p",
"chars": 70,
"preview": "library_size=10\nnum_log_files=1\nnum_log_sessions=5\nvideo_quality=480p\n"
},
{
"path": "benchmarks/media-streaming/dataset/files/filegen/params/720p",
"chars": 70,
"preview": "library_size=10\nnum_log_files=1\nnum_log_sessions=5\nvideo_quality=720p\n"
},
{
"path": "benchmarks/media-streaming/dataset/files/filegen/video_gen.py",
"chars": 4400,
"preview": "import re\nfrom subprocess import call\nimport os\nfrom sys import argv\nfrom random import randint\n\nvideo_io_filenames ={}\n"
},
{
"path": "benchmarks/media-streaming/server/Dockerfile",
"chars": 718,
"preview": "FROM cloudsuite/base-os:ubuntu\n\nRUN apt-get update -y \\\n && apt-get install -y --no-install-recommends nginx openssl \\\n"
},
{
"path": "benchmarks/media-streaming/server/entrypoint.sh",
"chars": 366,
"preview": "#!/bin/bash\ncd /etc/nginx\nopenssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout media_streaming_CS_4.key -out med"
},
{
"path": "benchmarks/media-streaming/server/files/HTMLWebPlayer/index.html",
"chars": 2610,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "benchmarks/media-streaming/server/files/HTMLWebPlayer/js/helper.js",
"chars": 1546,
"preview": "\n\nfunction populateVideosList(selectedList) {\n var size = Math.min(selectedList.length, 10)\n for (i = 0; i < size;"
},
{
"path": "benchmarks/media-streaming/server/files/limits.conf.append",
"chars": 149,
"preview": "* hard nofile 500000\n* soft nofile 500000\nroot hard nofile 500000\nroot "
},
{
"path": "benchmarks/media-streaming/server/files/nginx.location.append",
"chars": 2651,
"preview": "# You may add here your\n# server {\n#\t...\n# }\n# statements for each of your virtual hosts to this file\n\n##\n# You should l"
},
{
"path": "benchmarks/web-search/client/Dockerfile",
"chars": 1176,
"preview": "FROM cloudsuite/faban:1.4\n\nENV FABAN_PORT 9980\nENV ANT_VERSION 1.9.6\nENV ANT_HOME $BASE_PATH/ant\n\nENV CLIENT_HEAP_SIZE 2"
},
{
"path": "benchmarks/web-search/client/docker-entrypoint.py",
"chars": 6355,
"preview": "#!/usr/bin/env python3\n\nimport argparse\n\narg = argparse.ArgumentParser();\n\narg.add_argument(\"--ramp-up\", type=int, help="
},
{
"path": "benchmarks/web-search/client/files/search/LICENSE",
"chars": 1600,
"preview": "CloudSuite4.0 Benchmark Suite\nCopyright (c) 2022, Parallel Systems Architecture Lab, EPFL\nAll rights reserved.\nRedistrib"
},
{
"path": "benchmarks/web-search/client/files/search/build.properties",
"chars": 216,
"preview": "bench.shortname=search\nfaban.home=/path/to/faban/home/\nant.home=/path/to/ant/home/\nfaban.url=http://localhost:9980/\ndepl"
},
{
"path": "benchmarks/web-search/client/files/search/build.xml",
"chars": 5973,
"preview": "<project name=\"Faban Benchmark\" default=\"deploy.jar\" basedir=\".\">\n\n <property file=\"build.properties\"/>\n <property"
},
{
"path": "benchmarks/web-search/client/files/search/config/logging.properties",
"chars": 2431,
"preview": "############################################################\n# \tDefault Logging Configuration File\n#\n# You can use a di"
},
{
"path": "benchmarks/web-search/client/files/search/config/security/driver.policy",
"chars": 137,
"preview": "/* AUTOMATICALLY GENERATED ON Thu Dec 03 17:57:08 PST 1998*/\n/* DO NOT EDIT */\n\ngrant {\n permission java.security.AllPe"
},
{
"path": "benchmarks/web-search/client/files/search/src/sample/searchdriver/terms_ordered",
"chars": 1075479,
"preview": "110579 of\n91525 the\n82962 a\n70108 to\n66677 in\n45168 1\n45150 and\n36223 2\n34970 for\n26856 is\n24394 on\n24113 by\n23491 all\n2"
},
{
"path": "benchmarks/web-search/client/files/search/src/sample/searchdriver/terms_original",
"chars": 1264809,
"preview": "110579 of\n91525 in\n82962 the\n70108 for\n66677 and\n45168 to\n45150 free\n36223 a\n34970 google\n26856 new\n24394 http\n24113 on\n"
},
{
"path": "benchmarks/web-search/client/files/search/src/sample/searchdriver/terms_random",
"chars": 1599425,
"preview": "of\nthe\na\nto\nin\n1\nand\n2\nfor\nis\non\nby\nall\n0\n3\nwith\nthis\napache\n4\n2015\nuse\nfrom\n5\nare\nor\norg\nbe\nyour\nan\nthat\nhelp\nyou\nat\nit"
},
{
"path": "benchmarks/web-search/client/files/search/src/sample/searchdriver/terms_shuffled",
"chars": 1075479,
"preview": "110579 gave\n91525 continuent\n82962 marmotta\n70108 multiclass\n66677 ftpd\n45168 ixa\n45150 vnt\n36223 pegged\n34970 binarydoc"
},
{
"path": "benchmarks/web-search/client/files/search/template/Random.java.in",
"chars": 4306,
"preview": "public class SearchDriver {\n private DriverContext ctx;\n private HttpTransport http;\n String url;\n Random random = n"
},
{
"path": "benchmarks/web-search/client/files/search/template/Zipfian.java.in",
"chars": 4638,
"preview": "public class SearchDriver {\n private DriverContext ctx;\n private HttpTransport http;\n String url;\n Random random = n"
},
{
"path": "benchmarks/web-search/client/files/search/template/head.java.in",
"chars": 466,
"preview": "package sample.searchdriver;\n\nimport com.sun.faban.driver.*;\nimport javax.xml.xpath.XPathExpressionException;\nimport jav"
},
{
"path": "benchmarks/web-search/client/files/search/template/run.xml.in",
"chars": 4183,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<searchBenchmark>\n <jvmConfig xmlns=\"http://faban.sunsource.net/ns/fabanharnes"
},
{
"path": "benchmarks/web-search/dataset/Dockerfile",
"chars": 409,
"preview": "FROM cloudsuite/base-os:ubuntu\n\nRUN BUILD_DEPS=\"wget curl ca-certificates\" \\\n && set -x \\\n && apt-get update -y &&"
},
{
"path": "benchmarks/web-search/dataset/docker-entrypoint.sh",
"chars": 105,
"preview": "#!/bin/bash\n\n# Download datasets\nwget --progress=bar:force -O - $INDEX_URL |\n tar zxvf - -C /download\n"
},
{
"path": "benchmarks/web-search/index/Dockerfile",
"chars": 1817,
"preview": "FROM cloudsuite/java:openjdk17\n\nRUN apt-get update -y \\\n && apt-get install -y --no-install-recommends procps telnet ls"
},
{
"path": "benchmarks/web-search/index/entrypoint.sh",
"chars": 294,
"preview": "#!/bin/bash\n\nexport JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))\nexport SOLR_JAVA_HOME=$JAVA_HOME\n\n$SOL"
},
{
"path": "benchmarks/web-search/index/files/nutch-default.xml",
"chars": 93651,
"preview": "<?xml version=\"1.0\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"configuration.xsl\"?>\n<!--\n Licensed to the Apache Software "
},
{
"path": "benchmarks/web-search/index/files/schema.xml",
"chars": 24149,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!--\n Licensed to the Apache Software Foundation (ASF) under one or more\n contri"
},
{
"path": "benchmarks/web-search/index/files/seed.txt",
"chars": 27,
"preview": "https://www.cloudsuite.ch/\n"
},
{
"path": "benchmarks/web-search/index/files/solrconfig.xml",
"chars": 47370,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!--\n Licensed to the Apache Software Foundation (ASF) under one or more\n contri"
},
{
"path": "benchmarks/web-search/index/generate_index.sh",
"chars": 537,
"preview": "#! bin/bash\n\nexport JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))\n\ncd $NUTCH_HOME\n$NUTCH_HOME/bin/nutch "
},
{
"path": "benchmarks/web-search/server/Dockerfile",
"chars": 1526,
"preview": "FROM cloudsuite/java:openjdk17\n\nRUN apt-get update -y \\\n\t&& apt-get install -y --no-install-recommends procps telnet lso"
},
{
"path": "benchmarks/web-search/server/docker-entrypoint.sh",
"chars": 932,
"preview": "#!/bin/bash\n\n#Read the server's parameters\nexport SERVER_HEAP_SIZE=$1 &&\n export NUM_SERVERS=$2\n\n#Prepare Solr\nexport J"
},
{
"path": "benchmarks/web-search/server/files/limits.txt",
"chars": 50,
"preview": "* soft memlock unlimited\n* hard hemlock unlimited\n"
},
{
"path": "benchmarks/web-search/server/files/query.sh",
"chars": 500,
"preview": "#!/bin/bash\n\nIP=$1\nSOLR_PORT=8983\nuntil $(curl --output /dev/null --silent --head --fail http://$IP:${SOLR_PORT}); do\n "
},
{
"path": "benchmarks/web-search/server/files/schema.xml",
"chars": 24149,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!--\n Licensed to the Apache Software Foundation (ASF) under one or more\n contri"
},
{
"path": "benchmarks/web-search/server/files/solrconfig.xml",
"chars": 47370,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!--\n Licensed to the Apache Software Foundation (ASF) under one or more\n contri"
},
{
"path": "benchmarks/web-serving/db_server/Dockerfile",
"chars": 386,
"preview": "FROM cloudsuite/mysql:mariadb-10.6\n\nENV root_password root\nENV DB_URL http://datasets.epfl.ch/cloudsuite/ELGG_DB.tar.gz\n"
},
{
"path": "benchmarks/web-serving/db_server/entrypoint.sh",
"chars": 658,
"preview": "#!/bin/bash\n\nwget --progress=bar:force -O - --no-check-certificate http://datasets.epfl.ch/cloudsuite/ELGG_DB.tar.gz | t"
},
{
"path": "benchmarks/web-serving/faban_client/Dockerfile",
"chars": 725,
"preview": "FROM cloudsuite/faban:1.4\n\nRUN apt-get update && apt-get install -y \\\n\tant \\\n\tbuild-essential \\\n curl \\\n python3 \\"
},
{
"path": "benchmarks/web-serving/faban_client/files/users.list",
"chars": 2987465,
"preview": "107 aPksVSYYiu 54g3rkfAJ7\n109 ZZYgMYGUNI ijdgg1Ue6k\n111 mZUcaKKjrL zMRQGMv99p\n113 rdpXpQmRDD f59qVrxxLp\n115 nymAAofblA i"
},
{
"path": "benchmarks/web-serving/faban_client/files/usersetup.properties",
"chars": 224,
"preview": "# Properties of the user names.\n\n# The number of users \nnum_users=500\n\n# The length of the username and passwords to be "
},
{
"path": "benchmarks/web-serving/faban_client/files/web20_benchmark/.classpath",
"chars": 708,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" path=\"src\"/>\n\t<classpathentry kind=\"con\" "
}
]
// ... and 156 more files (download for full content)
About this extraction
This page contains the full source code of the parsa-epfl/cloudsuite GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 356 files (86.5 MB), approximately 2.6M tokens, and a symbol index with 676 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.