

{"id":7051,"date":"2017-11-11T13:08:20","date_gmt":"2017-11-11T18:08:20","guid":{"rendered":"https:\/\/rud.is\/b\/?p=7051"},"modified":"2018-03-10T07:54:16","modified_gmt":"2018-03-10T12:54:16","slug":"measuring-monitoring-internet-speed-with-r","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/","title":{"rendered":"Measuring &#038; Monitoring Internet Speed with R"},"content":{"rendered":"<p>Working remotely has many benefits, but if you work remotely in an area like, say, rural Maine, one of those benefits is not massively speedy internet connections. Being able to go fast and furious on the internet is one of the many things I miss about our time in Seattle and it is unlikely that we&#8217;ll be seeing Google Fiber in my small town any time soon. One other issue is that residential plans from evil giants like Comcast come with things like &#8220;bandwidth caps&#8221;. I suspect many WFH-ers can live within those limits, but I work with internet-scale data and often shunt extracts or whole datasets to the DatCave\u2122 server farm for local processing. As such, I pay an extra penalty as a Comcast &#8220;Business-class&#8221; user that has little benefit besides getting slightly higher QoS and some faster service response times when there are issues.<\/p>\n<p>Why go into all that? Well, I recently decided to bump up the connection from 100 Mb\/s to 150 Mb\/s (and managed to do so w\/o increasing the overall monthly bill at all) but wanted to have a way to regularly verify I am getting what I&#8217;m paying for <strong>without<\/strong> having to go to an interactive &#8220;speed test&#8221; site.<\/p>\n<p>There&#8217;s a handy <a href=\"https:\/\/github.com\/sivel\/speedtest-cli\/\"><code>speedtest-cli<\/code>?<\/a>, which is a python-based module with a command-line interface that can perform speed tests against <a href=\"http:\/\/legacy.speedtest.net\/\">Ookla&#8217;s legacy server<\/a>. (You&#8217;ll notice that link forwards you to their new socket-based test service; neither <code>speedtest-cli<\/code> nor the code in the package being shown here uses that yet)<\/p>\n<p>I run plenty of ruby, python, node and go (et al) programs on the command-line, but I wanted a way to measure this in R-proper (storing individual test results) on a regular basis as well as run something from the command-line whenever I wanted an interactive test. Thus begat <a href=\"https:\/\/github.com\/hrbrmstr\/speedtest\"><code>speedtest<\/code>?<\/a>.<\/p>\n<h3>Testing the Need for Speed<\/h3>\n<p>After you <code>devtools::install_github(\"hrbrmstr\/speedtest\")<\/code> the package, you can either type <code>speedtest::spd_test()<\/code> at an R console or <code>Rscript --quiet -e 'speedtest::spd_test()'<\/code> on the command-line to see something like the following:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"7052\" data-permalink=\"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/spdtst\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1468%2C792&amp;ssl=1\" data-orig-size=\"1468,792\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"spdtst\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=510%2C275&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?resize=510%2C275&#038;ssl=1\" alt=\"\" width=\"510\" height=\"275\" class=\"aligncenter size-full wp-image-7052\" \/><\/a><\/p>\n<p>What you see there is a short-hand version of what&#8217;s available in the package:<\/p>\n<ul>\n<li><code>spd_best_servers<\/code>:   Find &#8220;best&#8221; servers (latency-wise) from master server list<\/li>\n<li><code>spd_closest_servers<\/code>:    Find &#8220;closest&#8221; servers (geography-wise) from master server list<\/li>\n<li><code>spd_compute_bandwidth<\/code>:  Compute bandwidth from bytes transferred and time taken<\/li>\n<li><code>spd_config<\/code>: Retrieve client configuration information for the speedtest<\/li>\n<li><code>spd_download_test<\/code>:  Perform a download speed\/bandwidth test<\/li>\n<li><code>spd_servers<\/code>:    Retrieve a list of SpeedTest servers<\/li>\n<li><code>spd_upload_test<\/code>:    Perform an upload speed\/bandwidth test<\/li>\n<li><code>spd_test<\/code>:   Test your internet speed\/bandwidth<\/li>\n<\/ul>\n<p>The general idiom is to grab the test configuration file, collect the master list of servers, figure out which servers you&#8217;re going to test against and perform upload\/download tests + collect the resultant statistics:<\/p>\n<pre id=\"speedy01\"><code class=\"language-r\">library(speedtest)\r\nlibrary(stringi)\r\nlibrary(hrbrthemes)\r\nlibrary(ggbeeswarm)\r\nlibrary(tidyverse)\r\n\r\nconfig &lt;- spd_config()\r\n\r\nservers &lt;- spd_servers(config=config)\r\nclosest_servers &lt;- spd_closest_servers(servers, config=config)\r\nonly_the_best_severs &lt;- spd_best_servers(closest_servers, config)\r\n\r\nglimpse(spd_download_test(closest_servers[1,], config=config))\r\n## Observations: 1\r\n## Variables: 15\r\n## $ url     &lt;chr&gt; &quot;http:\/\/speed0.xcelx.net\/speedtest\/upload.php&quot;\r\n## $ lat     &lt;dbl&gt; 42.3875\r\n## $ lng     &lt;dbl&gt; -71.1\r\n## $ name    &lt;chr&gt; &quot;Somerville, MA&quot;\r\n## $ country &lt;chr&gt; &quot;United States&quot;\r\n## $ cc      &lt;chr&gt; &quot;US&quot;\r\n## $ sponsor &lt;chr&gt; &quot;Axcelx Technologies LLC&quot;\r\n## $ id      &lt;chr&gt; &quot;5960&quot;\r\n## $ host    &lt;chr&gt; &quot;speed0.xcelx.net:8080&quot;\r\n## $ url2    &lt;chr&gt; &quot;http:\/\/speed1.xcelx.net\/speedtest\/upload.php&quot;\r\n## $ min     &lt;dbl&gt; 14.40439\r\n## $ mean    &lt;dbl&gt; 60.06834\r\n## $ median  &lt;dbl&gt; 55.28457\r\n## $ max     &lt;dbl&gt; 127.9436\r\n## $ sd      &lt;dbl&gt; 34.20695\r\n\r\nglimpse(spd_upload_test(only_the_best_severs[1,], config=config))\r\n## Observations: 1\r\n## Variables: 18\r\n## $ ping_time      &lt;dbl&gt; 0.02712567\r\n## $ total_time     &lt;dbl&gt; 0.059917\r\n## $ retrieval_time &lt;dbl&gt; 2.3e-05\r\n## $ url            &lt;chr&gt; &quot;http:\/\/speed0.xcelx.net\/speedtest\/upload.php&quot;\r\n## $ lat            &lt;dbl&gt; 42.3875\r\n## $ lng            &lt;dbl&gt; -71.1\r\n## $ name           &lt;chr&gt; &quot;Somerville, MA&quot;\r\n## $ country        &lt;chr&gt; &quot;United States&quot;\r\n## $ cc             &lt;chr&gt; &quot;US&quot;\r\n## $ sponsor        &lt;chr&gt; &quot;Axcelx Technologies LLC&quot;\r\n## $ id             &lt;chr&gt; &quot;5960&quot;\r\n## $ host           &lt;chr&gt; &quot;speed0.xcelx.net:8080&quot;\r\n## $ url2           &lt;chr&gt; &quot;http:\/\/speed1.xcelx.net\/speedtest\/upload.php&quot;\r\n## $ min            &lt;dbl&gt; 6.240858\r\n## $ mean           &lt;dbl&gt; 9.527599\r\n## $ median         &lt;dbl&gt; 9.303148\r\n## $ max            &lt;dbl&gt; 12.56686\r\n## $ sd             &lt;dbl&gt; 2.451778\r\n```<\/code><\/pre>\n<h3>Spinning More Wheels<\/h3>\n<p>The default operation for each test function is to return summary statistics. If you dig into the package source, or look at how the legacy measuring site performs the speed test tasks, you&#8217;ll see that the process involves uploading and downloading a series of files (or, more generally, random data) of increasing size and calculating how long it takes to perform those actions. Smaller size tests will have skewed results on fast connections with low latency, which is why the sites do the incremental tests (and why you see the &#8220;needles&#8221; move the way they do on interactive tests). We can disable summary statistics and retrieve all of results of individual tests (as we&#8217;ll do in a bit).<\/p>\n<p>Speed tests are also highly dependent on the processing capability of the target server as well as the network location (hops away), &#8220;quality&#8221; and load. You&#8217;ll often see interactive sites choose the &#8220;best&#8221; server. There are many ways to do that. One is geography, which has some merit, but should not be the only factor used. Another is latency, which is comparing a small connection test against each server and measuring which one comes back the fastest.<\/p>\n<p>It&#8217;s straightforward to show the impact of each with a simple test harness. We&#8217;ll pick 3 geographic &#8220;closest&#8221; geographic servers, 3 &#8220;best&#8221; latency servers (those may overlap with &#8220;closest&#8221;) and 3 randomly chosen ones:<\/p>\n<pre id=\"speedy02\"><code class=\"language-r\">set.seed(8675309)\r\n\r\nbind_rows(\r\n\r\n  closest_servers[1:3,] %&gt;%\r\n    mutate(type=&quot;closest&quot;),\r\n\r\n  only_the_best_severs[1:3,] %&gt;%\r\n    mutate(type=&quot;best&quot;),\r\n\r\n  filter(servers, !(id %in% c(closest_servers[1:3,]$id, only_the_best_severs[1:3,]$id))) %&gt;%\r\n    sample_n(3) %&gt;%\r\n    mutate(type=&quot;random&quot;)\r\n\r\n) %&gt;%\r\n  group_by(type) %&gt;%\r\n  ungroup() -&gt; to_compare\r\n\r\nselect(to_compare, sponsor, name, country, host, type)\r\n## # A tibble: 9 x 5\r\n##                   sponsor            name       country\r\n##                     &lt;chr&gt;           &lt;chr&gt;         &lt;chr&gt;\r\n## 1 Axcelx Technologies LLC  Somerville, MA United States\r\n## 2                 Comcast      Boston, MA United States\r\n## 3            Starry, Inc.      Boston, MA United States\r\n## 4 Axcelx Technologies LLC  Somerville, MA United States\r\n## 5 Norwood Light Broadband     Norwood, MA United States\r\n## 6       CCI - New England  Providence, RI United States\r\n## 7                 PirxNet         Gliwice        Poland\r\n## 8           Interoute VDC Los Angeles, CA United States\r\n## 9                   UNPAD         Bandung     Indonesia\r\n## # ... with 2 more variables: host &lt;chr&gt;, type &lt;chr&gt;<\/code><\/pre>\n<p>As predicted, there are some duplicates, but we&#8217;ll perform upload and download tests for each of them and compare the results. First, download:<\/p>\n<pre id=\"speedy03\"><code class=\"language-r\">map_df(1:nrow(to_compare), ~{\r\n  spd_download_test(to_compare[.x,], config=config, summarise=FALSE, timeout=30)\r\n}) -&gt; dl_results_full\r\n\r\nmutate(dl_results_full, type=stri_trans_totitle(type)) %&gt;%\r\n  ggplot(aes(type, bw, fill=type)) +\r\n  geom_quasirandom(aes(size=size, color=type), width=0.15, shape=21, stroke=0.25) +\r\n  scale_y_continuous(expand=c(0,5), labels=c(sprintf(&quot;%s&quot;, seq(0,150,50)), &quot;200 Mb\/s&quot;), limits=c(0,200)) +\r\n  scale_size(range=c(2,6)) +\r\n  scale_color_manual(values=c(Random=&quot;#b2b2b2&quot;, Best=&quot;#2b2b2b&quot;, Closest=&quot;#2b2b2b&quot;)) +\r\n  scale_fill_ipsum() +\r\n  labs(x=NULL, y=NULL, title=&quot;Download bandwidth test by selected server type&quot;,\r\n       subtitle=&quot;Circle size scaled by size of file used in that speed test&quot;) +\r\n  theme_ipsum_rc(grid=&quot;Y&quot;) +\r\n  theme(legend.position=&quot;none&quot;)<\/code><\/pre>\n<p><a href=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/unnamed-chunk-5-1-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"7059\" data-permalink=\"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/unnamed-chunk-5-1-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/unnamed-chunk-5-1-1.png?fit=672%2C480&amp;ssl=1\" data-orig-size=\"672,480\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"unnamed-chunk-5-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/unnamed-chunk-5-1-1.png?fit=510%2C364&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/unnamed-chunk-5-1-1.png?resize=510%2C364&#038;ssl=1\" alt=\"\" width=\"510\" height=\"364\" class=\"aligncenter size-full wp-image-7059\" \/><\/a><\/p>\n<p>I&#8217;m going to avoid hammering really remote servers with the upload test (truth-be-told I just don&#8217;t want to wait as long as I know it&#8217;s going to take):<\/p>\n<pre id=\"speedy04\"><code class=\"language-r\">bind_rows(\r\n  closest_servers[1:3,] %&gt;% mutate(type=&quot;closest&quot;),\r\n  only_the_best_severs[1:3,] %&gt;% mutate(type=&quot;best&quot;)\r\n) %&gt;%\r\n  distinct(.keep_all=TRUE) -&gt; to_compare\r\n\r\nselect(to_compare, sponsor, name, country, host, type)\r\n## # A tibble: 6 x 5\r\n##                   sponsor           name       country\r\n##                     &lt;chr&gt;          &lt;chr&gt;         &lt;chr&gt;\r\n## 1 Axcelx Technologies LLC Somerville, MA United States\r\n## 2                 Comcast     Boston, MA United States\r\n## 3            Starry, Inc.     Boston, MA United States\r\n## 4 Axcelx Technologies LLC Somerville, MA United States\r\n## 5 Norwood Light Broadband    Norwood, MA United States\r\n## 6       CCI - New England Providence, RI United States\r\n## # ... with 2 more variables: host &lt;chr&gt;, type &lt;chr&gt;\r\n\r\nmap_df(1:nrow(to_compare), ~{\r\n  spd_upload_test(to_compare[.x,], config=config, summarise=FALSE, timeout=30)\r\n}) -&gt; ul_results_full\r\n\r\nggplot(ul_results_full, aes(x=&quot;Upload Test&quot;, y=bw)) +\r\n  geom_quasirandom(aes(size=size, fill=&quot;col&quot;), width=0.1, shape=21, stroke=0.25, color=&quot;#2b2b2b&quot;) +\r\n  scale_y_continuous(expand=c(0,0.5), breaks=seq(0,16,4),\r\n                     labels=c(sprintf(&quot;%s&quot;, seq(0,12,4)), &quot;16 Mb\/s&quot;), limits=c(0,16)) +\r\n  scale_size(range=c(2,6)) +\r\n  scale_fill_ipsum() +\r\n  labs(x=NULL, y=NULL, title=&quot;Upload bandwidth test by selected server type&quot;,\r\n       subtitle=&quot;Circle size scaled by size of file used in that speed test&quot;) +\r\n  theme_ipsum_rc(grid=&quot;Y&quot;) +\r\n  theme(legend.position=&quot;none&quot;)<\/code><\/pre>\n<p><a href=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/unnamed-chunk-12-1.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"7060\" data-permalink=\"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/unnamed-chunk-12-1\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/unnamed-chunk-12-1.png?fit=1344%2C960&amp;ssl=1\" data-orig-size=\"1344,960\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"unnamed-chunk-12-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/unnamed-chunk-12-1.png?fit=510%2C364&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/unnamed-chunk-12-1.png?resize=510%2C364&#038;ssl=1\" alt=\"\" width=\"510\" height=\"364\" class=\"aligncenter size-full wp-image-7060\" \/><\/a><\/p>\n<p>As indicated, data payload size definitely impacts the speed tests (as does &#8220;proximity&#8221;), but you&#8217;ll also see variance if you run the same tests again with the same target servers. Note, also, that the &#8220;command-line&#8221; ready function tries to make the quickest target selection and only chooses the max values.<\/p>\n<h3>FIN<\/h3>\n<p>The <a href=\"https:\/\/github.com\/hrbrmstr\/speedtest\">github site<\/a> has a list of TODOs and any\/all are welcome to pile on (full credit for any contributions, as usual). So kick the tyres, file issues and start measuring!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Working remotely has many benefits, but if you work remotely in an area like, say, rural Maine, one of those benefits is not massively speedy internet connections. Being able to go fast and furious on the internet is one of the many things I miss about our time in Seattle and it is unlikely that [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":7052,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[91],"tags":[810],"class_list":["post-7051","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-r","tag-post"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Measuring &amp; Monitoring Internet Speed with R - rud.is<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Measuring &amp; Monitoring Internet Speed with R - rud.is\" \/>\n<meta property=\"og:description\" content=\"Working remotely has many benefits, but if you work remotely in an area like, say, rural Maine, one of those benefits is not massively speedy internet connections. Being able to go fast and furious on the internet is one of the many things I miss about our time in Seattle and it is unlikely that [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2017-11-11T18:08:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-03-10T12:54:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1468%2C792&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1468\" \/>\n\t<meta property=\"og:image:height\" content=\"792\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"hrbrmstr\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"hrbrmstr\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"Measuring &#038; Monitoring Internet Speed with R\",\"datePublished\":\"2017-11-11T18:08:20+00:00\",\"dateModified\":\"2018-03-10T12:54:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/\"},\"wordCount\":836,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/spdtst.gif?fit=1468%2C792&ssl=1\",\"keywords\":[\"post\"],\"articleSection\":[\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/\",\"name\":\"Measuring & Monitoring Internet Speed with R - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/spdtst.gif?fit=1468%2C792&ssl=1\",\"datePublished\":\"2017-11-11T18:08:20+00:00\",\"dateModified\":\"2018-03-10T12:54:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/spdtst.gif?fit=1468%2C792&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2017\\\/11\\\/spdtst.gif?fit=1468%2C792&ssl=1\",\"width\":1468,\"height\":792},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/11\\\/11\\\/measuring-monitoring-internet-speed-with-r\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Measuring &#038; Monitoring Internet Speed with R\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/\",\"name\":\"rud.is\",\"description\":\"&quot;In God we trust. All others must bring data&quot;\",\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rud.is\\\/b\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\",\"name\":\"hrbrmstr\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"width\":460,\"height\":460,\"caption\":\"hrbrmstr\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\"},\"description\":\"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7\",\"sameAs\":[\"http:\\\/\\\/rud.is\"],\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/author\\\/hrbrmstr\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Measuring & Monitoring Internet Speed with R - rud.is","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/","og_locale":"en_US","og_type":"article","og_title":"Measuring & Monitoring Internet Speed with R - rud.is","og_description":"Working remotely has many benefits, but if you work remotely in an area like, say, rural Maine, one of those benefits is not massively speedy internet connections. Being able to go fast and furious on the internet is one of the many things I miss about our time in Seattle and it is unlikely that [&hellip;]","og_url":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/","og_site_name":"rud.is","article_published_time":"2017-11-11T18:08:20+00:00","article_modified_time":"2018-03-10T12:54:16+00:00","og_image":[{"width":1468,"height":792,"url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1468%2C792&ssl=1","type":"image\/gif"}],"author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"Measuring &#038; Monitoring Internet Speed with R","datePublished":"2017-11-11T18:08:20+00:00","dateModified":"2018-03-10T12:54:16+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/"},"wordCount":836,"commentCount":4,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"image":{"@id":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1468%2C792&ssl=1","keywords":["post"],"articleSection":["R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/","url":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/","name":"Measuring & Monitoring Internet Speed with R - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/#primaryimage"},"image":{"@id":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1468%2C792&ssl=1","datePublished":"2017-11-11T18:08:20+00:00","dateModified":"2018-03-10T12:54:16+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/#primaryimage","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1468%2C792&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1468%2C792&ssl=1","width":1468,"height":792},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2017\/11\/11\/measuring-monitoring-internet-speed-with-r\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"Measuring &#038; Monitoring Internet Speed with R"}]},{"@type":"WebSite","@id":"https:\/\/rud.is\/b\/#website","url":"https:\/\/rud.is\/b\/","name":"rud.is","description":"&quot;In God we trust. All others must bring data&quot;","publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rud.is\/b\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886","name":"hrbrmstr","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","width":460,"height":460,"caption":"hrbrmstr"},"logo":{"@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1"},"description":"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7","sameAs":["http:\/\/rud.is"],"url":"https:\/\/rud.is\/b\/author\/hrbrmstr\/"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/11\/spdtst.gif?fit=1468%2C792&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p23idr-1PJ","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":12438,"url":"https:\/\/rud.is\/b\/2019\/08\/22\/quick-hit-a-new-64-bit-swift-5-rswitch-app\/","url_meta":{"origin":7051,"position":0},"title":"Quick Hit: A new 64-bit Swift 5 RSwitch App","author":"hrbrmstr","date":"2019-08-22","format":false,"excerpt":"At the bottom of the R for macOS Developer's Page there's mention of an \"other binary\" called \"RSwitch\" that is \"a small GUI that allows you to switch between R versions quickly (if you have multiple versions of R framework installed).\" Said switching requires you to use the \"tar.gz\" versions\u2026","rel":"","context":"In &quot;Apple&quot;","block_context":{"text":"Apple","link":"https:\/\/rud.is\/b\/category\/apple\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":5097,"url":"https:\/\/rud.is\/b\/2017\/02\/23\/on-watering-holes-trust-defensible-systems-and-data-science-community-security\/","url_meta":{"origin":7051,"position":1},"title":"On Watering Holes, Trust, Defensible Systems and Data Science Community Security","author":"hrbrmstr","date":"2017-02-23","format":false,"excerpt":"I've been threatening to do a series on \"data science community security\" for a while and had cause to issue this inaugural post today. It all started with this: Hey #rstats folks: don't do this. Srsly. Don't do this. Pls. Will blog why. Just don't do this. https:\/\/t.co\/qkem5ruEBi\u2014 boB Rudis\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/02\/hieRarchy.png?fit=1200%2C1035&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/02\/hieRarchy.png?fit=1200%2C1035&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/02\/hieRarchy.png?fit=1200%2C1035&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/02\/hieRarchy.png?fit=1200%2C1035&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/02\/hieRarchy.png?fit=1200%2C1035&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":11911,"url":"https:\/\/rud.is\/b\/2019\/02\/14\/using-the-ropendata-r-package-to-access-petabytes-of-free-internet-telemetry-data-from-rapid7\/","url_meta":{"origin":7051,"position":2},"title":"Using the ropendata R Package to Access Petabytes of Free Internet Telemetry Data from Rapid7","author":"hrbrmstr","date":"2019-02-14","format":false,"excerpt":"I've got a post up over at $DAYJOB's blog on using the ropendata? package to access the ginormous and ever-increasing amount of internet telemetry (scan) data via the Rapid7 Open Data API. It's super-R-code-heavy but renders surprisingly well in Ghost (the blogging platform we use at work) and covers everything\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":9584,"url":"https:\/\/rud.is\/b\/2018\/04\/13\/does-congress-really-care-about-your-privacy\/","url_meta":{"origin":7051,"position":3},"title":"Does Congress Really Care About Your Privacy?","author":"hrbrmstr","date":"2018-04-13","format":false,"excerpt":"I apologize up-front for using bad words in this post. Said bad words include \"Facebook\", \"Mark Zuckerberg\" and many referrals to entities within the U.S. Government. Given the topic, it cannot be helped. I've also left the R tag on this despite only showing some ggplot2 plots and Markdown tables.\u2026","rel":"","context":"In &quot;Commentary&quot;","block_context":{"text":"Commentary","link":"https:\/\/rud.is\/b\/category\/commentary\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/04\/privacy-final.png?fit=1200%2C1045&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/04\/privacy-final.png?fit=1200%2C1045&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/04\/privacy-final.png?fit=1200%2C1045&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/04\/privacy-final.png?fit=1200%2C1045&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/04\/privacy-final.png?fit=1200%2C1045&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":187,"url":"https:\/\/rud.is\/b\/2011\/02\/23\/herding-firesheep\/","url_meta":{"origin":7051,"position":4},"title":"Herding [Fire]sheep","author":"hrbrmstr","date":"2011-02-23","format":false,"excerpt":"By now, many non-IT and non-Security folk have heard of Firesheep, a tool written by @codebutler which allows anyone using Firefox on unprotected networks to capture and hjijack active sessions to popular social media sites (and other web sites). The sidebar\/extension puts an attactive and easy-to-understand GUI over a process\u2026","rel":"","context":"In &quot;Information Security&quot;","block_context":{"text":"Information Security","link":"https:\/\/rud.is\/b\/category\/information-security\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11527,"url":"https:\/\/rud.is\/b\/2018\/09\/17\/access-the-internet-archive-advanced-search-scrape-api-with-wayback-a-links-to-a-new-vignette-pkgdown-site\/","url_meta":{"origin":7051,"position":5},"title":"Access the Internet Archive Advanced Search\/Scrape API with wayback (+ links to a new vignette &#038; pkgdown site)","author":"hrbrmstr","date":"2018-09-17","format":false,"excerpt":"The wayback? package has had an update to more efficiently retrieve mementos and added support for working with the Internet Archive's advanced search+scrape API. Search\/Scrape The search\/scrape interface lets you examine the IA collections and download what you are after (programmatically). The main function is ia_scrape() but you can also\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/7051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/comments?post=7051"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/7051\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media\/7052"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=7051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=7051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=7051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}