PDQ is an open-source library for modeling and analyzing the performance and capacity of computer, manufacturing, and network systems using queueing theory. It helps developers, engineers, and researchers quickly build and solve queueing-network models across multiple programming languages. Learn more: What is PDQ?
- What is PDQ?
- Supported Languages
- Supported Platforms
- Maintainers
- Contributors
- License
- Documentation
- Example (R)
PDQ is a library of functions for solving queueing-network models of systems such as:
- Distributed computer systems
- Manufacturing systems
- Packet networks
PDQ models can be written in a variety of conventional programming languages.
The book Analyzing Computer System Performance with Perl::PDQ presents example applications for computer system performance analysis written in Perl.
An additional example in Python is provided below.
Overview: What is PDQ?
- C Programming Language (native language of the PDQ library).
- Supported via the R PDQ Interface.
- Example PDQ models in R can be found in:
- Refer to the R Readme for more details.
- Python 3 support has been added and follows the R interface.
- Examples are available here.
- Refer to the Python Readme for more details.
- Perl PDQ maintenance officially ended with PDQ release 6.2.0.
- This ensures compatibility with the 2nd edition of the Perl PDQ book (2011).
- Linux
- macOS
- Windows
- Neil Gunther
- Paul Puglia
- Vahid Negahdari
- Denny Chen
- Phil Feller
- Neil Gunther
- Peter Harding
- Paul Puglia
- Sam Zallocco
- Vahid Negahdari
PDQ is distributed as OSS under the MIT license.
The following PDQ model, written in R, simulates an AWS cloud application using the CreateMultiNode function along with the MSC option for modeling a multiserver queue that services a finite number of user requests.
For background, see:
Linux-Tomcat Application Performance on Amazon AWS
library(pdq)
requests <- 400 # user load
threads <- 300 # tomcat threads
stime <- 0.444 # measured service time
Init("AWS Tomcat Model")
CreateClosed("Requests", BATCH, requests, 0.0)
CreateMultiNode(threads, "Threads", MSC, FCFS)
SetDemand("Threads", "Requests", stime)
SetWUnit("Reqs")
Solve(EXACT)
Report()This would procude an output like this:
PRETTY DAMN QUICK REPORT
==========================================
*** on Tue Nov 24 08:10:59 2020 ***
*** for AWS Tomcat Model ***
*** PDQ Version 7.0.0 Build 112420 ***
==========================================
==========================================
******** PDQ Model INPUTS ********
==========================================
Queueing Network Parameters
Node Sched Resource Workload Class Service time
---- ----- -------- -------- ----- ------------
MSC FCFS Threads Requests BATCH 0.444000
Network type: CLOSED
Workload streams: 1
Queueing nodes: 1
Workload Jobs R minimum
-------- ---- ----------
Requests 400.00 0.4440
==========================================
******** PDQ Model OUTPUTS ********
==========================================
Solution method: EXACT
******** SYSTEM Performance ********
Metric Value Unit
------ ------- ----
Workload: "Requests"
Mean concurrency 400.0000 Reqs
Mean throughput 675.6757 Reqs/Sec
Response time 0.5920 Sec
Stretch factor 1.3333
Bounds Analysis:
Max throughput 675.6757 Reqs/Sec
Min response 0.4440 Sec
Max demand 0.0015 Sec
Total demand 0.4440 Sec
Optimal jobs 300.0000 Jobs
******** RESOURCE Performance ********
Metric Resource Work Value Unit
------ -------- ---- ------- ----
Capacity Threads Requests 300 Servers
Throughput Threads Requests 675.6757 Reqs/Sec
In service Threads Requests 300.0000 Reqs
Utilization Threads Requests 100.0000 Percent
Queue length Threads Requests 400.0000 Reqs
Waiting line Threads Requests 100.0000 Reqs
Waiting time Threads Requests 0.1480 Sec
Residence time Threads Requests 0.5920 Sec