Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
155 commits
Select commit Hold shift + click to select a range
4348a61
draft run script that loops over hitrates and calibration points
HerrHorizontal Jul 25, 2025
e496a38
callable script for the HTCondor jobs
HerrHorizontal Jul 25, 2025
68873f3
shell file
HerrHorizontal Jul 25, 2025
73e185e
draft submit file
HerrHorizontal Jul 25, 2025
383d7c5
make scenario specific adjustments
HerrHorizontal Jul 25, 2025
dec1128
add test platform template
HerrHorizontal Jul 25, 2025
070ba6d
run simulation
HerrHorizontal Jul 25, 2025
04ea3b4
create temporary platform file
HerrHorizontal Jul 25, 2025
3d35c11
run with multiple hitrates
HerrHorizontal Jul 25, 2025
0553a13
default values for hitrates
HerrHorizontal Jul 25, 2025
bc28a45
default values for hitrates
HerrHorizontal Jul 25, 2025
c482ede
remove accidently staged file
HerrHorizontal Jul 25, 2025
8fec989
update gitignore
HerrHorizontal Jul 25, 2025
2237923
keep default values
HerrHorizontal Jul 25, 2025
ad5ceaa
tar all output files
HerrHorizontal Jul 25, 2025
ace1244
use config files from container
HerrHorizontal Jul 25, 2025
6951ae7
improve error handling and messaging
HerrHorizontal Jul 25, 2025
309b758
don't configure defaults and queue in steps
HerrHorizontal Jul 25, 2025
2253811
trying to fix the submit file
HerrHorizontal Jul 25, 2025
9cc4f88
generate condor submit file from template
HerrHorizontal Jul 25, 2025
2590e38
update docker image
HerrHorizontal Jul 25, 2025
14687e8
fix file paths
HerrHorizontal Jul 28, 2025
f4fa085
make start and end idices configurable with defaults
HerrHorizontal Jul 28, 2025
17bbf32
adjust outfile name
HerrHorizontal Jul 29, 2025
008c579
actually adjust outfile name
HerrHorizontal Jul 29, 2025
3932909
debug
HerrHorizontal Jul 29, 2025
925d62a
permission error
HerrHorizontal Jul 30, 2025
978e343
use basenames, since in working directory
HerrHorizontal Jul 31, 2025
4e03ff3
use basenames, since in working directory
HerrHorizontal Jul 31, 2025
30dfa99
try again
HerrHorizontal Aug 1, 2025
a21ba40
try again
HerrHorizontal Aug 1, 2025
ed99a96
file name fix
HerrHorizontal Aug 4, 2025
a0147c8
slimmer submit file
HerrHorizontal Aug 4, 2025
9a613d5
improvements plotting script
HerrHorizontal Aug 5, 2025
6cda33a
add seaborn to devcontainer
HerrHorizontal Aug 5, 2025
87cb032
move argparser
HerrHorizontal Aug 5, 2025
8e443ac
workaround for too many files
HerrHorizontal Aug 5, 2025
685b693
adjust regex to harvest correct hitrate values
HerrHorizontal Aug 5, 2025
2848567
adjust regex to harvest correct hitrate values
HerrHorizontal Aug 5, 2025
cd48531
fix regex to capture full float
HerrHorizontal Aug 5, 2025
f88550d
type hints
HerrHorizontal Aug 6, 2025
9e3bd23
add data compatibility
HerrHorizontal Aug 6, 2025
82ff54f
implement data plot
HerrHorizontal Aug 7, 2025
b3992a4
fix concurrent processes
HerrHorizontal Aug 7, 2025
b84d8d5
also allow tar.gz files as input
HerrHorizontal Aug 7, 2025
e4ab23b
log message improvement
HerrHorizontal Aug 7, 2025
f6511cc
fix data treatment
HerrHorizontal Aug 7, 2025
1df6123
adjust separators
HerrHorizontal Aug 7, 2025
522857e
file handling
HerrHorizontal Aug 7, 2025
29fede4
adjust regex for data files
HerrHorizontal Aug 7, 2025
3c230aa
ylim adjustments
HerrHorizontal Aug 7, 2025
3708ec8
check for empty dataframes before plotting
HerrHorizontal Aug 7, 2025
3a92452
adjust plotting of data
HerrHorizontal Aug 7, 2025
e19faef
fix savepath
HerrHorizontal Aug 7, 2025
72233ad
adjust data processing
HerrHorizontal Aug 7, 2025
1137b45
add forgotten hitrate
HerrHorizontal Aug 7, 2025
b4ab99c
use direct information in df
HerrHorizontal Aug 7, 2025
b3117b7
fix data file into df conversion and plotting
HerrHorizontal Aug 8, 2025
65f2f81
fix labels
HerrHorizontal Aug 8, 2025
4229e8a
make runs for different scenarios configurable
HerrHorizontal Aug 8, 2025
16e17d4
fix output target
HerrHorizontal Aug 8, 2025
b99fadb
improve type hints
HerrHorizontal Aug 11, 2025
f2f81b2
devcontainer change
HerrHorizontal Aug 13, 2025
4fcb52b
make workload and dataset configurable
HerrHorizontal Aug 13, 2025
51a4272
adjust config paths in run command
HerrHorizontal Aug 14, 2025
4ee8f5c
added sg01 scale
Jesse-McDonald Aug 19, 2025
df44678
oopse
Jesse-McDonald Aug 19, 2025
b42dc0f
Update simcal_calibrator.py
Jesse-McDonald Aug 19, 2025
febb8f2
Update simcal_calibrator.py
Jesse-McDonald Aug 19, 2025
eeb2a9e
Update simcal_calibrator.py
Jesse-McDonald Aug 19, 2025
a4d13af
Update simcal_calibrator.py
Jesse-McDonald Aug 19, 2025
e561ffd
Update simcal_calibrator.py
Jesse-McDonald Aug 19, 2025
82bdb2d
handle faulty data
HerrHorizontal Aug 25, 2025
2c858c3
make sure additional packages are in the devcontainer
HerrHorizontal Aug 25, 2025
cbbdf52
Update simcal_calibrator.py
Jesse-McDonald Aug 25, 2025
06462e1
updated sg01 arg
Jesse-McDonald Aug 25, 2025
4e74811
Update hitratePerformancePlots.py
Jesse-McDonald Aug 25, 2025
053a676
Update simcal_calibrator.py
Jesse-McDonald Aug 26, 2025
1cc2510
Update simcal_calibrator.py
Jesse-McDonald Aug 26, 2025
8ddd4b1
Update simcal_calibrator.py
Jesse-McDonald Aug 26, 2025
1505443
Update simcal_calibrator.py
Jesse-McDonald Aug 26, 2025
79a138a
reduce default value for overhead flops introduced by streaming
HerrHorizontal Aug 26, 2025
d6ad56a
update gitignore
HerrHorizontal Aug 26, 2025
52b462d
update gitignore
HerrHorizontal Aug 26, 2025
c02cf4f
ready for new calibratiton
Jesse-McDonald Sep 19, 2025
e64598f
Update simcal_calibrator.py
Jesse-McDonald Sep 19, 2025
98e2b7d
Update simcal_calibrator.py
Jesse-McDonald Sep 20, 2025
094e111
guess we were calibrating it
Jesse-McDonald Sep 23, 2025
21ba1c6
Update generate_synthetic.py
Jesse-McDonald Sep 25, 2025
e54afcb
Update generate_synthetic.py
Jesse-McDonald Sep 25, 2025
012d1e4
Update generate_synthetic.py
Jesse-McDonald Sep 25, 2025
355ada0
updates synthetic
Jesse-McDonald Sep 25, 2025
7777ad0
Update generate_synthetic.py
Jesse-McDonald Sep 25, 2025
f507923
Update evaluate_synthetic.py
Jesse-McDonald Sep 30, 2025
5bc0be1
chmod
Sep 30, 2025
8a954ec
missed a param
Jesse-McDonald Oct 13, 2025
4ef524d
Update simcal_run.py
Jesse-McDonald Oct 13, 2025
7fc4e81
new parameters to test
Jesse-McDonald Oct 14, 2025
fc0c47b
use env
Dec 3, 2025
bfc354e
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
815129d
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
b58fe20
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
c47d524
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
4e8c2f1
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
4f16e29
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
c903eda
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
51413bc
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
c311098
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
ed88adc
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
45391a1
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
82b617c
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
56a40fd
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
d4f99e0
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
6bf6f0f
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
e34353b
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
5d093c6
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
d6b6e02
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
5de1196
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
559cef0
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
0f4909b
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
304d1c7
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
4dbb750
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
bd3b683
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
d7c8d48
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
6cc6251
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
0a42adc
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
260e520
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
ec58b81
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
786e429
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
3df6513
Update simcal_calibrator.py
Jesse-McDonald Dec 17, 2025
184eed3
added timeline
Jesse-McDonald Jan 22, 2026
f40f6c0
added arg to limit hitrates
Jesse-McDonald Jan 23, 2026
2b0d4f6
Update simcal_calibrator.py
Jesse-McDonald Jan 23, 2026
9efa60f
Update simcal_calibrator.py
Jesse-McDonald Jan 23, 2026
9c0f2f8
Update simcal_calibrator.py
Jesse-McDonald Jan 23, 2026
aa3b58c
added makespan loss
Jesse-McDonald Jan 31, 2026
5f76822
Update simcal_calibrator.py
Jesse-McDonald Jan 31, 2026
31f751d
Update simcal_calibrator.py
Jesse-McDonald Jan 31, 2026
54501f1
Update simcal_calibrator.py
Jesse-McDonald Jan 31, 2026
deae0a0
Update simcal_calibrator.py
Jesse-McDonald Jan 31, 2026
20bf91c
Update simcal_calibrator.py
Jesse-McDonald Jan 31, 2026
dcc88d2
Update simcal_calibrator.py
Jesse-McDonald Jan 31, 2026
795c643
Update simcal_calibrator.py
Jesse-McDonald Jan 31, 2026
b2d6972
Update simcal_calibrator.py
Jesse-McDonald Feb 3, 2026
b7ad33b
Update simcal_calibrator.py
Jesse-McDonald Feb 3, 2026
3a7b3ed
Update simcal_calibrator.py
Jesse-McDonald Feb 3, 2026
4e1829b
Create example_eval_command.sh
Jesse-McDonald Feb 3, 2026
923a208
improve help message and logging
HerrHorizontal Jan 23, 2026
30bde5a
Improve data handling and regex matching
HerrHorizontal Feb 3, 2026
a22ce0b
can test on only slow data
Jesse-McDonald Feb 5, 2026
08b48bd
Update simcal_calibrator.py
Jesse-McDonald Feb 5, 2026
7b0cfa0
Update simcal_calibrator.py
Jesse-McDonald Feb 5, 2026
95f42f5
Update simcal_calibrator.py
Jesse-McDonald Feb 5, 2026
a6bd35a
Update simcal_calibrator.py
Jesse-McDonald Feb 5, 2026
72bcca9
Update simcal_calibrator.py
Jesse-McDonald Feb 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-dockerfile
{
"name": "Existing Dockerfile",
"name": "DCSim devcontainer",
"build": {
// Sets the run context to one level up instead of the .devcontainer folder.
"context": "..",
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ tmp
*.csv
*.txt
tools/tmp*
tools/**/*.tmp

# logs and tests
logs
Expand All @@ -51,3 +52,4 @@ callgrind.out*

# venv
.venv/*
*.DS_Store
4 changes: 4 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ RUN mkdir -p build && pushd build && \

USER root
RUN pushd build && make install && popd && ldconfig

USER dcsim

# Final image
Expand All @@ -31,4 +32,7 @@ COPY --from=builder /home/dcsim/.local /home/dcsim/.local
COPY --chown=dcsim:dcsim data/ /home/DCSim/data/
COPY --chown=dcsim:dcsim tools/ /home/DCSim/tools/

# Install tool dependencies
RUN python3 -m pip install --break-system-packages seaborn

RUN dc-sim --help
2 changes: 1 addition & 1 deletion data/platform-files/sgbatch_validation_template.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

<zone id="global" routing="Full">
<zone id="ETP" routing="Floyd">
<host id="sg01.etp.kit.edu" speed="{cpu-speed}" core="24">
<host id="sg01.etp.kit.edu" speed="{scaled-cpu-speed}" core="24">
<prop id="type" value="worker,cache"/>
<prop id="ram" value="64TiB"/>
<!-- <disk id="ssd_cache1" read_bw="1GBps" write_bw="1GBps"> -->
Expand Down
8 changes: 4 additions & 4 deletions src/SimpleSimulator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ bool SimpleSimulator::infile_caching_on = true; // flag to turn
bool SimpleSimulator::prefetching_on = true; // flag to enable prefetching during streaming
bool SimpleSimulator::shuffle_jobs = false; // flag to enable job shuffling during submission
sg_size_t SimpleSimulator::xrd_block_size = 1000 * 1000 * 1000; // maximum size of the streamed file blocks in bytes for the XRootD-ish streaming
double SimpleSimulator::xrd_add_flops_per_time = 20000000000; // flops overhead introduced by XRootD streaming per second
double SimpleSimulator::xrd_add_flops_local_per_time = 0;
double SimpleSimulator::xrd_add_flops_per_time = 1000000; // flops overhead introduced by XRootD streaming per second
double SimpleSimulator::xrd_add_flops_local_per_time = 1000000; // flops overhead introduced by streaming from local storage per second
// TODO: The initialized below is likely bogus (at compile time?)
std::set<std::string> SimpleSimulator::cache_hosts;
std::set<std::string> SimpleSimulator::storage_hosts;
Expand Down Expand Up @@ -247,8 +247,8 @@ po::variables_map process_program_options(int argc, char **argv) {
bool shuffle_jobs = false;

sg_size_t xrd_block_size = 1000 * 1000 * 1000;
double xrd_add_flops_per_time = 20000000000;
double xrd_add_flops_local_per_time = 0;
double xrd_add_flops_per_time = 1000000;
double xrd_add_flops_local_per_time = 1000000;
std::string storage_service_buffer_size = "1048576";// 1MiB

unsigned int seed = 42;
Expand Down
Binary file modified tools/__pycache__/simcal_calibrator.cpython-312.pyc
Binary file not shown.
4 changes: 2 additions & 2 deletions tools/evaluate_synthetic.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ def main(args):
cal[0]["externalSlowNetwork"]=cal[0]["externalNetwork"]
del cal[0]["externalNetwork"]
for key in cal[0]:
if key == "xrootd_flops":
continue
#if key == "xrootd_flops":
# continue
error+=relative_error(args[key],cal[0][key])
print(error,cal[1],file)
break
Expand Down
1 change: 1 addition & 0 deletions tools/example_eval_command.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
./simcal_calibrator.py -a random -t 0 -c 1 -g "$(subRoot.sh)/hep-testjob" -l makespan --keep --include_slow -e "{'cpuSpeed': 1939132803.61, 'cpuSpeed2': 2092187255.84, 'ramDisk': 9206335155.91, 'disk': 33119776.04, 'internalNetwork': 837152846.40, 'xrd_flops_per_time_local': 431422.19, 'xrd_flops_per_time': 325.92, 'externalFastNetwork': 7053334151.98, 'externalSlowNetwork': 187714455.56}"
27 changes: 20 additions & 7 deletions tools/generate_synthetic.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,8 @@ def dcsim(self, env, args):
"--cfg=network/loopback-bw:100000000000000",
"--no-caching",
"--seed", 0,
"--xrd-flops-per-time",args["xrootd_flops"]
"--xrd-flops-per-time-local",args["xrd_flops_per_time_local"],
"--xrd-flops-per-time",args["xrd_flops_per_time"],
]
for i in range(len(cargs)):
cargs[i]=str(cargs[i])
Expand All @@ -134,6 +135,7 @@ def fill_template(self, env, args):

# Replace the placeholders in the XML file with the specified values
xml_contents = re.sub(r'{cpu-speed}', str(args["cpuSpeed"]), xml_contents)
xml_contents = re.sub(r'{scaled-cpu-speed}', str(args["cpuSpeed2"]), xml_contents)
xml_contents = re.sub(r'{read-speed}', str(args["cacheSpeed"]), xml_contents)
xml_contents = re.sub(r'{link-speed}', str(args["internalNetworkSpeed"]), xml_contents)
xml_contents = re.sub(r'{net-speed}', str(args["externalNetworkSpeed"]), xml_contents)
Expand All @@ -154,7 +156,7 @@ def call_platform(self, env, args):
for hitrate in self.hitrates:
#print(workload,hitrate,)
os.makedirs(args["output"]/workload/args["cacheName"]/args["SGname"], exist_ok=True)
i,o=self.dcsim(env,{"workload":self.workloads[workload], "platform":platform.name, "hitrate":hitrate,"xrootd_block":self.xrootd_blocksize,"network_blocksize":self.network_blocksize,"xrootd_flops":args["xrootd_flops"],"output":args["output"]/workload/args["cacheName"]/args["SGname"]/("synthetic_hitrate_"+str(hitrate)+".csv")})
i,o=self.dcsim(env,{"workload":self.workloads[workload], "platform":platform.name, "hitrate":hitrate,"xrootd_block":self.xrootd_blocksize,"network_blocksize":self.network_blocksize,"xrd_flops_per_time_local":args["xrd_flops_per_time_local"],"xrd_flops_per_time":args["xrd_flops_per_time"],"output":args["output"]/workload/args["cacheName"]/args["SGname"]/("synthetic_hitrate_"+str(hitrate)+".csv")})

platform.close()

Expand All @@ -167,43 +169,51 @@ def run(self, env, args):
#scsn =
self.call_platform(env,
{"cpuSpeed": args["cpuSpeed"],
"cpuSpeed2": args["cpuSpeed2"],
"cacheSpeed": args["disk"],
"internalNetworkSpeed": args["internalNetwork"],
"externalNetworkSpeed": args["externalSlowNetwork"],
"xrootd_flops":args["xrootd_flops"],
"xrd_flops_per_time":args["xrd_flops_per_time"],
"xrd_flops_per_time_local":args["xrd_flops_per_time_local"],
"output":args["output"],
"cacheName":"diskCache",
"SGname":"SG1_Synthetic1Gbps"
})
#fcsn =
self.call_platform(env,
{"cpuSpeed": args["cpuSpeed"],
"cpuSpeed2": args["cpuSpeed2"],
"cacheSpeed": args["ramDisk"],
"internalNetworkSpeed": args["internalNetwork"],
"externalNetworkSpeed": args["externalSlowNetwork"],
"xrootd_flops":args["xrootd_flops"],
"xrd_flops_per_time":args["xrd_flops_per_time"],
"xrd_flops_per_time_local":args["xrd_flops_per_time_local"],
"output":args["output"],
"cacheName":"ramCache",
"SGname":"SG1_Synthetic1Gbps"
})
#fcfn =
self.call_platform(env,
{"cpuSpeed": args["cpuSpeed"],
"cpuSpeed2": args["cpuSpeed2"],
"cacheSpeed": args["ramDisk"],
"internalNetworkSpeed": args["internalNetwork"],
"externalNetworkSpeed": args["externalFastNetwork"],
"xrootd_flops":args["xrootd_flops"],
"xrd_flops_per_time":args["xrd_flops_per_time"],
"xrd_flops_per_time_local":args["xrd_flops_per_time_local"],
"output":args["output"],
"cacheName":"ramCache",
"SGname":"SG1_Synthetic10Gbps"
})
#scfn =
self.call_platform(env,
{"cpuSpeed": args["cpuSpeed"],
"cpuSpeed2": args["cpuSpeed2"],
"cacheSpeed": args["disk"],
"internalNetworkSpeed": args["internalNetwork"],
"externalNetworkSpeed": args["externalFastNetwork"],
"xrootd_flops":args["xrootd_flops"],
"xrd_flops_per_time":args["xrd_flops_per_time"],
"xrd_flops_per_time_local":args["xrd_flops_per_time_local"],
"output":args["output"],
"cacheName":"diskCache",
"SGname":"SG1_Synthetic10Gbps"
Expand Down Expand Up @@ -259,4 +269,7 @@ def run(self, env, args):
#print(cal)
#print(t1-t0)

#./generate_synthetic.py -g "$(subRoot.sh)/hep-testjob-copy" -o "$(subRoot.sh)/synthetic" -c $(nproc) -a "{'cpuSpeed': 1950000000, 'ramDisk': 27000000000, 'disk': 23000000, 'internalNetwork': 1900000000, 'xrootd_flops': 1000000000000, 'externalFastNetwork': 4000000000, 'externalSlowNetwork': 218000000}"
#OUT OF DATE#./generate_synthetic.py -g "$(subRoot.sh)/hep-testjob-copy" -o "$(subRoot.sh)/synthetic" -c $(nproc) -a "{'cpuSpeed': 1950000000, 'ramDisk': 27000000000, 'disk': 23000000, 'internalNetwork': 1900000000, 'xrootd_flops': 1000000000000, 'externalFastNetwork': 4000000000, 'externalSlowNetwork': 218000000}"
#above left for record incase we ever need it again

#./generate_synthetic.py -g "$(subRoot.sh)/hep-testjob-copy" -o "$(subRoot.sh)/synthetic" -c $(nproc) -a "{'cpuSpeed': 2197000000, 'cpuSpeed2': 1895000000, 'ramDisk': 2200000000, 'disk': 32000000, 'internalNetwork': 605000000, 'xrd_flops_per_time_local': 19000000, 'xrd_flops_per_time': 10000000, 'externalFastNetwork': 600000000, 'externalSlowNetwork': 73000000}"
Loading