Has TekSavvy Lost Their Way?

I have been using TekSavvy since February 2013, almost 10 years. Generally, I have been delighted by the service until the past month.

In the past month, I’ve been having trouble getting to websites and repeating the attempt multiple times. Success can take minutes. Just downloading from Epic Games to update a game is taking forever. This is nowhere near 300Mbps or even a decent fraction. The attempt reports regular messages of having issues connecting. Steam similarly has regular failures but is more robust at retrying.

Here is what is interesting: with my laptop connected directly to the modem (configured as pass-thru, so it only does PPPoE as I have a Cisco Meraki router behind it), speedtest.net reports my cable connection has the expected speeds of almost 300 Mbps down and almost 30 Mbps up. The ping is 10-15ms. But the latency ends up going up into the 500s. If I run the speed test and attempt to ping in the background, pings take upward of a second.

I have been working with TekSavvy to fix this, but it has turned into a conflict between Rogers and TekSavvy. Rogers has come twice and confirmed the signal strength is good but added a filter anyway. I have replaced the modem at just shy of $200—still no difference.

Here is a collection of tests run, all directly from a laptop connected to the modem, with no other hardware in the way.

Ping

Here is my ping result connecting to google.ca. I started the ping and then ran the speed test in the background:

ping -4 -n 50 google.ca

Pinging google.ca [142.251.41.35] with 32 bytes of data:
Reply from 142.251.41.35: bytes=32 time=14ms TTL=117
Reply from 142.251.41.35: bytes=32 time=18ms TTL=117
Reply from 142.251.41.35: bytes=32 time=17ms TTL=117
Reply from 142.251.41.35: bytes=32 time=12ms TTL=117
Reply from 142.251.41.35: bytes=32 time=12ms TTL=117
Reply from 142.251.41.35: bytes=32 time=21ms TTL=117
Reply from 142.251.41.35: bytes=32 time=11ms TTL=117
Reply from 142.251.41.35: bytes=32 time=89ms TTL=117
Reply from 142.251.41.35: bytes=32 time=346ms TTL=117
Reply from 142.251.41.35: bytes=32 time=564ms TTL=117
Reply from 142.251.41.35: bytes=32 time=622ms TTL=117
Reply from 142.251.41.35: bytes=32 time=600ms TTL=117
Reply from 142.251.41.35: bytes=32 time=585ms TTL=117
Reply from 142.251.41.35: bytes=32 time=613ms TTL=117
Reply from 142.251.41.35: bytes=32 time=635ms TTL=117
Reply from 142.251.41.35: bytes=32 time=611ms TTL=117
Reply from 142.251.41.35: bytes=32 time=724ms TTL=117
Reply from 142.251.41.35: bytes=32 time=772ms TTL=117
Reply from 142.251.41.35: bytes=32 time=547ms TTL=117
Reply from 142.251.41.35: bytes=32 time=894ms TTL=117
Reply from 142.251.41.35: bytes=32 time=960ms TTL=117
Reply from 142.251.41.35: bytes=32 time=959ms TTL=117
Reply from 142.251.41.35: bytes=32 time=13ms TTL=117
Reply from 142.251.41.35: bytes=32 time=28ms TTL=117
Reply from 142.251.41.35: bytes=32 time=46ms TTL=117
Reply from 142.251.41.35: bytes=32 time=20ms TTL=117
Reply from 142.251.41.35: bytes=32 time=20ms TTL=117
Reply from 142.251.41.35: bytes=32 time=15ms TTL=117
...

Trace Route without Saturation

This test has no speed test running in the background.

tracert -4 google.ca

Tracing route to google.ca [142.251.41.35]
over a maximum of 30 hops:

  1    12 ms    12 ms    11 ms  135-23-134-225.cpe.pppoe.ca [135.23.134.225]
  2    12 ms    13 ms    11 ms  newkirk.rcable-tsi.tor.teksavvy.com [104.195.128.90]
  3    17 ms    13 ms    13 ms  newkirk.tsi-rcable.tor.teksavvy.com [104.195.128.89]
  4    15 ms    13 ms    25 ms  ae4-0-bdr01-tor.teksavvy.com [206.248.155.94]
  5    17 ms    11 ms    18 ms  ae8-0-bdr01-tor2.teksavvy.com [206.248.155.9]
  6    15 ms    14 ms    14 ms  142.250.166.168
  7    15 ms    14 ms    14 ms  74.125.244.145
  8    15 ms    16 ms    13 ms  216.239.49.189
  9    13 ms    13 ms    11 ms  yyz12s08-in-f3.1e100.net [142.251.41.35]

Trace Route with Saturation

This test does have the speed test running in the background, but the speed test completed before the traceroute did.

tracert -4 google.ca

Tracing route to google.ca [142.251.41.35]
over a maximum of 30 hops:

  1   309 ms   451 ms   531 ms  135-23-134-225.cpe.pppoe.ca [135.23.134.225]
  2     *        *      736 ms  newkirk.rcable-tsi.tor.teksavvy.com [104.195.128.90]
  3   915 ms   866 ms   872 ms  newkirk.tsi-rcable.tor.teksavvy.com [104.195.128.89]
  4   951 ms    21 ms    17 ms  ae4-0-bdr01-tor.teksavvy.com [206.248.155.94]
  5   148 ms    70 ms    99 ms  ae8-0-bdr01-tor2.teksavvy.com [206.248.155.9]
  6    29 ms    32 ms    31 ms  142.250.166.168
  7    16 ms    20 ms    21 ms  74.125.244.145
  8    34 ms    31 ms    35 ms  216.239.49.189
  9    22 ms    14 ms    14 ms  yyz12s08-in-f3.1e100.net [142.251.41.35]

Next Steps

I have replaced the modem, and Rogers has been here twice to investigate. So it is either Rogers or TekSavvy. To make that determination, I am now switching my internet provider. If it fixes the problem, the problem is at TekSavvy. If it doesn’t, it is Rogers.

Follow Up

I posted this to Twitter, and TekSavvy is being more responsive but still heavily deflecting from the possibility of being a possible cause.

They pointed me to lg.teksavvy.com where I got the following results for hitting google.ca using Tor1 and Tor2:

BGP Results
Trace Route Results

Since ping and tracert seem fine without traffic but they fails when there is network traffic. This does not indicate there isn’t a problem in TekSavvy data center.

CI/CD Scaling for Multiple Projects

While building the Jenkinsfile.groovy for a single project is straightforward, we want to share the logic across multiple C# projects.

I won’t go into the details as I did with my other posts about the process I went through. I moved the logic for Jenkinsfile.groovy into a Jenkins shared library, which is publicly available at Jenkins Library Sample.

Continue reading

CI/CD Log Processing

I was delighted to integrate the static analysis, but at the time of writing, I didn’t have the means to process the output. However, I have found a tool to process it.

The Jenkins plugin “Warnings Next Generation” supports processing the sarif file and can process the entire log. Furthermore, it provides functionality to gather the results that we can include in our Slack messages.

Continue reading

CI/CD Extending Slack Support

As I continue to extend functionality for the jenkins-project-sample-dotnet, I’m wandering into areas I haven’t explored before. I have refined previous posts to simplify steps based on what I learned; however, revising what I did before won’t scale.

In the case of Slack notifications, the previous post is fine for simple posts, but I wanted to do something a little extra. I want to post a Slack message to a channel and post follow-up messages with additional information.

I need to use a Slack bot user instead of the Jenkins CI integration to achieve this.

Continue reading

CI/CD Slack Notifications

You may not currently be using Slack for communication. Still, it is worth considering if you are working in a group (even for school projects) and aren’t using an alternative (beyond email). You can set up a Slack workspace for free and configure it for notifications.

I have a workspace set up for myself that I use with my family for sending lots of random stuff, but I also use it to test integrations I can then apply elsewhere.

Continue reading

CI/CD Static Security Scanning

The following is inspired by the article from Kris the Coding Unicorn. This is not meant to be a comprehensive suite of tests but a start.

The following steps use the open-source Security Code Scan project, which publishes a tool to NuGet.

Unfortunately, Jenkins doesn’t seem to have a mechanism for visualizing security scans, so the output file is stored as an artifact of the job.

Continue reading

CI/CD Code Coverage

Code coverage measures how much of the code is covered when running tests. This is a useful indicator of how effective tests are. One of the features we want to add is to set a minimum bar for testing to increase the quality of our components.

Visual Studio 2022 Community Edition doesn’t automatically include code coverage features out of the box. There are some things we can do to expose it in Jenkins during our build processes, validate the results, and possibly fail the build based on it. Within Visual Studio itself, you can install Fine Code Coverage from the Visual Studio Marketplace or consider tools such as NCrunch.

Adding additional steps to Jenkins won’t take long to get code coverage data and expose it on the Jenkins build page.

Continue reading

CI/CD Revisions!

I have been relying on my previous efforts over five years ago that initially set out our C# builds in Jenkins. However, my next topic, code coverage, was new territory for me.

In the process of working through code coverage, I had the opportunity to discover opportunities to clean up the existing build scripts set out in the previous articles so far.

This article will cover the revisions I’ve made. However, I’ll also update the previous articles that will jump immediately to the result.

Continue reading