Почему CDN не работает так, как должно быть?

Меня всегда смущают CDN и то, делают ли они свою работу эффективно.

Я знаю, что теоретически их цель - сократить время ожидания между сервером и пользователем.

Тем не менее, я обычно люблю проверять вещи, прежде чем пытаться. Поэтому я загрузил изображение на imgur.com, а затем проверил скорость файла изображения на 2 сайтах:

Первый тест: https://tools.keycdn.com/performance

Второй тест: https://tools.pingdom.com/

Я выбрал Нью-Йорк в качестве места тестирования на втором веб-сайте. Итак, я попал на первый тест - он дал мне задержку в 200-300 мс в Нью-Йорке. Затем я проверил тест на втором сайте, и он также дал мне довольно большую задержку, например, 300 мс или около того.

Когда я нажимаю на тест во второй раз, он, конечно, снижается до 15-30 мс, потому что это то, что должен делать CDN.

Вопрос в том, что эти 2 сервера были в одном месте, но похоже, что изображение вообще не кэшировалось. Почему это происходит или чего мне здесь не хватает? Я подумал, что если он кешируется, то это должно уже уменьшить задержку ЛЮБОГО другого запрашивающего сервера / пользователя в этой области. Я ошибся?

1 ответ

Решение

CDN помимо попыток быстрой доставки вашего контента (сокращения задержки) может помочь вам также защитить / обезопасить свое происхождение, не раскрывая его напрямую, ознакомьтесь с этой статьей о других преимуществах: что такое CDN?

Что касается вашего теста, есть много факторов, например, все новое содержание (MISS) всегда будет занимать больше времени, так как он не был кэширован, то есть контент, который уже был предварительно извлечен и кэширован (HIT).

Вы можете начать с проверки заголовков, например, в терминале запустить это:

$ curl -I https://immortal.run/img/immortal.png

Вы можете увидеть вывод как это:

HTTP/2 200
date: Fri, 17 Aug 2018 07:51:20 GMT
content-type: image/png
content-length: 6757
set-cookie: __cfduid=d0be8792ec1e81d223eaa9e05b780a8fa1534492280; expires=Sat, 17-Aug-19 07:51:20 GMT; path=/; domain=.immortal.run; HttpOnly
last-modified: Thu, 07 Jun 2018 20:20:47 GMT
access-control-allow-origin: *
expires: Fri, 17 Aug 2018 11:51:20 GMT
cache-control: public, max-age=14400
x-github-request-id: 47B0:1A82:37CB24D:4D9A0A9:5B752825
cf-cache-status: HIT
accept-ranges: bytes
strict-transport-security: max-age=15552000; includeSubDomains; preload
x-content-type-options: nosniff
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 44ba8e10cb6597aa-FRA

Обратите внимание на заголовок:

cf-cache-status: HIT

Когда ресурс будет кэширован и обслужен из CDN, он будет HIT если нет, то это может быть MISS здесь вы можете увидеть список возможных ответов, относящихся к Cloudflare: https://support.cloudflare.com/hc/en-us/articles/200168266-What-do-the-various-Cloudflare-cache-responses-HIT-Expired-etc-mean- и т.д. среднеквадратичной

Теперь, чтобы проверить, насколько быстро загружается ресурс, вы можете использовать curl В зависимости от вашей оболочки вы можете добавить следующую функцию curl_time() в ~/.profile, ~/.zshrc или же ~/.bashrc

curl_time() {
    curl -o /dev/null -Ls -w " \
        time_namelookup:  %{time_namelookup}\n \
        time_connect:  %{time_connect}\n \
        time_appconnect:  %{time_appconnect}\n \
        time_pretransfer:  %{time_pretransfer}\n \
        time_redirect:  %{time_redirect}\n \
        time_starttransfer:  %{time_starttransfer}\n \
        ----------\n \
        time_total:  %{time_total}\n" "$1"
}

Затем попробуйте что-то вроде этого:

$ curl_time https://immortal.run/img/immortal.png
         time_namelookup:  0.133057
         time_connect:  0.144885
         time_appconnect:  0.200092
         time_pretransfer:  0.200299
         time_redirect:  0.000000
         time_starttransfer:  0.416685
         ----------
         time_total:  0.418580

В моих последующих запросах я получал его быстрее time_total: 0.093495:

$ curl_time https://immortal.run/img/immortal.png
         time_namelookup:  0.004583
         time_connect:  0.019833
         time_appconnect:  0.067715
         time_pretransfer:  0.067839
         time_redirect:  0.000000
         time_starttransfer:  0.091393
         ----------
         time_total:  0.093495

Если вы просто хотите получить итоговое время, вы можете попробовать это:

$ for i in {1..3}; \
curl -sL -w "%{time_total}\n" -o /dev/null https://immortal.run/img/immortal.png

Анализ заголовков и времени отклика является хорошей отправной точкой для проверки поведения CDN.

Другие вопросы по тегам