{"id":33932,"date":"2025-11-09T01:01:31","date_gmt":"2025-11-08T22:01:31","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/"},"modified":"2025-11-09T01:01:31","modified_gmt":"2025-11-08T22:01:31","slug":"postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/","title":{"rendered":"PostgreSQL Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Optimize Etme Rehberi"},"content":{"rendered":"<p><body><\/p>\n<style>\n    body {\n        font-family: Arial, sans-serif;\n        line-height: 1.6;\n        color: #333;\n        max-width: 900px;\n        margin: 0 auto;\n        padding: 20px;\n    }\n    h2, h3 {\n        color: #2c3e50;\n        margin-top: 30px;\n        margin-bottom: 15px;\n    }\n    h2 {\n        border-bottom: 2px solid #3498db;\n        padding-bottom: 10px;\n    }\n    p {\n        margin-bottom: 15px;\n    }\n    ul, ol {\n        margin-bottom: 15px;\n        margin-left: 20px;\n    }\n    pre {\n        background-color: #ecf0f1;\n        padding: 15px;\n        border-radius: 5px;\n        overflow-x: auto;\n        margin-bottom: 20px;\n    }\n    code {\n        font-family: \"Courier New\", Courier, monospace;\n        color: #c0392b;\n    }\n    .expert-tip {\n        background-color: #e8f6f3;\n        border-left: 5px solid #1abc9c;\n        padding: 15px;\n        margin: 20px 0;\n        border-radius: 4px;\n        color: #2c3e50;\n    }\n    table {\n        width: 100%;\n        border-collapse: collapse;\n        margin-bottom: 20px;\n    }\n    th, td {\n        border: 1px solid #ddd;\n        padding: 8px;\n        text-align: left;\n    }\n    th {\n        background-color: #f2f2f2;\n    }<\/p>\n<p>    \/* Mobil uyumluluk i\u00e7in medya sorgular\u0131 *\/\n    @media (max-width: 768px) {\n        body {\n            padding: 15px;\n        }\n        h2 {\n            font-size: 1.5em;\n        }\n        h3 {\n            font-size: 1.2em;\n        }\n        table, thead, tbody, th, td, tr {\n            display: block;\n        }\n        thead tr {\n            position: absolute;\n            top: -9999px;\n            left: -9999px;\n        }\n        tr { border: 1px solid #ccc; margin-bottom: 10px; }\n        td {\n            border: none;\n            border-bottom: 1px solid #eee;\n            position: relative;\n            padding-left: 50%;\n            text-align: right;\n        }\n        td:before {\n            position: absolute;\n            top: 6px;\n            left: 6px;\n            width: 45%;\n            padding-right: 10px;\n            white-space: nowrap;\n            text-align: left;\n            font-weight: bold;\n        }\n        \/* Her s\u00fctun i\u00e7in ba\u015fl\u0131\u011f\u0131 burada tan\u0131mlay\u0131n *\/\n        td:nth-of-type(1):before { content: \"Metrik:\"; }\n        td:nth-of-type(2):before { content: \"A\u00e7\u0131klama:\"; }\n    }\n<\/style>\n<p>Uygulama performans\u0131n\u0131z\u0131 PostgreSQL ile maksimize etmek mi istiyorsunuz? k6 y\u00fck testi ile optimal ba\u011flant\u0131 havuzu boyutunu nas\u0131l bulaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. Sunucu kaynaklar\u0131n\u0131 verimli kullan\u0131n ve darbo\u011fazlar\u0131 ortadan kald\u0131r\u0131n. Bu rehber, uygulaman\u0131z\u0131n ger\u00e7ek potansiyelini ortaya \u00e7\u0131karmak i\u00e7in ihtiyac\u0131n\u0131z olan t\u00fcm bilgileri sunuyor.<\/p>\n<p>Modern uygulamalar, kullan\u0131c\u0131 deneyimini do\u011frudan etkileyen h\u0131z ve yan\u0131t s\u00fcresi beklentisiyle kar\u015f\u0131 kar\u015f\u0131yad\u0131r. Bir web uygulamas\u0131, mobil servis ya da arka plan i\u015fleme sistemi fark etmeksizin, veritaban\u0131 etkile\u015fimleri genellikle performans\u0131n en kritik bile\u015fenlerinden biridir. \u00d6zellikle PostgreSQL gibi g\u00fc\u00e7l\u00fc bir ili\u015fkisel veritaban\u0131 kullan\u0131yorsan\u0131z, onunla olan ba\u011flant\u0131lar\u0131n\u0131z\u0131n y\u00f6netimi, uygulaman\u0131z\u0131n ne kadar h\u0131zl\u0131 ve verimli \u00e7al\u0131\u015faca\u011f\u0131n\u0131 do\u011frudan belirler. Peki, uygulaman\u0131z\u0131n performans\u0131 neden aniden d\u00fc\u015f\u00fcyor veya yo\u011fun y\u00fck alt\u0131nda yava\u015fl\u0131yor olabilir? \u00c7o\u011fu zaman sorun, veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131n do\u011fru y\u00f6netilememesinden kaynaklan\u0131r.<\/p>\n<p>Her bir veritaban\u0131 ba\u011flant\u0131s\u0131, sunucu taraf\u0131nda belirli bir maliyete sahiptir. Yeni bir ba\u011flant\u0131 a\u00e7mak, a\u011f \u00fczerinden el s\u0131k\u0131\u015fma (handshake), kimlik do\u011frulama ve kaynak tahsisi gibi i\u015flemler gerektirir. Bu s\u00fcre\u00e7ler zaman al\u0131c\u0131d\u0131r ve binlerce kullan\u0131c\u0131n\u0131n e\u015fzamanl\u0131 olarak uygulaman\u0131za eri\u015fmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131 senaryolarda ciddi bir darbo\u011faza d\u00f6n\u00fc\u015febilir. \u0130\u015fte bu noktada <strong>PostgreSQL ba\u011flant\u0131 havuzu<\/strong> devreye girer. Ba\u011flant\u0131 havuzu, \u00f6nceden a\u00e7\u0131lm\u0131\u015f ve kullan\u0131ma haz\u0131r veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131n bir koleksiyonudur. Uygulama bir ba\u011flant\u0131ya ihtiya\u00e7 duydu\u011funda, havuzdan mevcut bir ba\u011flant\u0131y\u0131 al\u0131r; i\u015fi bitti\u011finde ise ba\u011flant\u0131y\u0131 kapatmak yerine havuza geri verir. Bu mekanizma, ba\u011flant\u0131 a\u00e7ma\/kapama maliyetlerini ortadan kald\u0131rarak performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r ve veritaban\u0131 sunucusunun y\u00fck\u00fcn\u00fc azalt\u0131r.<\/p>\n<p>Ancak, her g\u00fczel \u015fey gibi, ba\u011flant\u0131 havuzlar\u0131n\u0131n da bir tatl\u0131 noktas\u0131 vard\u0131r. Havuz boyutu \u00e7ok k\u00fc\u00e7\u00fck olursa, uygulamalar ba\u011flant\u0131 beklemek zorunda kal\u0131r ve yan\u0131t s\u00fcreleri artar. Di\u011fer yandan, havuz boyutu \u00e7ok b\u00fcy\u00fck olursa, veritaban\u0131 sunucusu \u00e7ok fazla e\u015fzamanl\u0131 ba\u011flant\u0131y\u0131 y\u00f6netmek zorunda kal\u0131r. Bu durum, sunucunun belle\u011fini, CPU&#8217;sunu ve di\u011fer kaynaklar\u0131n\u0131 gereksiz yere t\u00fcketir, kilitlenmelere yol a\u00e7ar ve genel sistem performans\u0131n\u0131 olumsuz etkiler. Dolay\u0131s\u0131yla, uygulaman\u0131z\u0131n ve veritaban\u0131n\u0131z\u0131n i\u015f y\u00fck\u00fc profiline g\u00f6re <strong>optimal ba\u011flant\u0131 havuzu boyutunu bulmak<\/strong>, kritik bir optimizasyon ad\u0131m\u0131d\u0131r.<\/p>\n<p>Peki, bu optimal boyutu nas\u0131l bulaca\u011f\u0131z? \u0130\u015fte burada <strong>k6 y\u00fck testi<\/strong> arac\u0131 devreye giriyor. k6, JavaScript ile yaz\u0131lan, modern, geli\u015ftirici dostu ve son derece esnek bir y\u00fck test arac\u0131d\u0131r. Geleneksel y\u00fck testi ara\u00e7lar\u0131n\u0131n aksine, k6 bir test beti\u011fini kolayca yazman\u0131za, s\u00fcrd\u00fcrmenize ve kaynaklar\u0131 verimli bir \u015fekilde kullanman\u0131za olanak tan\u0131r. Uygulaman\u0131z\u0131n farkl\u0131 y\u00fck seviyeleri alt\u0131nda nas\u0131l davrand\u0131\u011f\u0131n\u0131 sim\u00fcle ederek, ba\u011flant\u0131 havuzu boyutunun performansa etkisini net bir \u015fekilde g\u00f6rmenizi sa\u011flar. Bu makale boyunca, k6 kullanarak PostgreSQL ba\u011flant\u0131 havuzunuz i\u00e7in m\u00fckemmel dengeyi nas\u0131l bulaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Haz\u0131rl\u0131k a\u015famas\u0131ndan veri analizine, ger\u00e7ek d\u00fcnya senaryolar\u0131ndan ileri d\u00fczey ipu\u00e7lar\u0131na kadar her \u015feyi derinlemesine inceleyece\u011fiz. Uygulaman\u0131z\u0131n gizli performans potansiyelini ortaya \u00e7\u0131karmaya haz\u0131r olun!<\/p>\n<h2>Temel Kavramlar: PostgreSQL Ba\u011flant\u0131 Havuzu ve k6 Y\u00fck Testi Nedir?<\/h2>\n<p>PostgreSQL ba\u011flant\u0131 havuzunun ne oldu\u011funu ve k6 y\u00fck testinin neden bu kadar etkili bir ara\u00e7 oldu\u011funu anlamadan, optimal boyutu belirleme s\u00fcrecine ba\u015flayamay\u0131z. Bu b\u00f6l\u00fcmde, konuya yabanc\u0131 olan okuyucular\u0131m\u0131z i\u00e7in bu iki temel kavram\u0131 detayl\u0131 bir \u015fekilde a\u00e7\u0131klayaca\u011f\u0131z. \u00c7\u00fcnk\u00fc bu bilgileri sa\u011flam bir \u015fekilde oturtmak, daha sonra yapaca\u011f\u0131m\u0131z uygulamal\u0131 ad\u0131mlar\u0131 anlamam\u0131z i\u00e7in hayati \u00f6nem ta\u015f\u0131yor.<\/p>\n<h3>PostgreSQL Ba\u011flant\u0131 Havuzu: Verimlili\u011fin Anahtar\u0131 Nedir?<\/h3>\n<p>Veritaban\u0131 ba\u011flant\u0131 havuzu, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131n bir havuzda topland\u0131\u011f\u0131 bir mekanizmad\u0131r. Bir uygulaman\u0131n PostgreSQL&#8217;e her ba\u011flanmak istedi\u011finde yeni bir ba\u011flant\u0131 a\u00e7mas\u0131, ciddi bir performans y\u00fck\u00fc getirir. Bu i\u015flem, TCP\/IP el s\u0131k\u0131\u015fmas\u0131, kimlik do\u011frulama (kullan\u0131c\u0131 ad\u0131, \u015fifre kontrol\u00fc), yetkilendirme ve veritaban\u0131 oturumu ba\u015flatma gibi ad\u0131mlar\u0131 i\u00e7erir. Bu ad\u0131mlar, her istek i\u00e7in tekrarland\u0131\u011f\u0131nda, \u00f6zellikle y\u00fcksek trafikli sistemlerde milisaniyeleri saniyeye d\u00f6n\u00fc\u015ft\u00fcrebilir. Ba\u011flant\u0131 havuzu ise bu maliyeti ortadan kald\u0131r\u0131r.<\/p>\n<p>Ba\u011flant\u0131 havuzu genellikle uygulaman\u0131n kendisi i\u00e7inde (\u00f6rne\u011fin Java&#8217;da HikariCP, Python&#8217;da SQLAlchemy&#8217;nin havuzlar\u0131, Node.js&#8217;te <code>pg-pool<\/code> gibi k\u00fct\u00fcphaneler) veya ayr\u0131 bir s\u00fcre\u00e7\/proxy olarak (\u00f6rne\u011fin <a href=\"https:\/\/www.pgbouncer.org\/\">PgBouncer<\/a> veya <a href=\"https:\/\/github.com\/yandex\/odyssey\">Odyssey<\/a>) \u00e7al\u0131\u015f\u0131r. \u00c7al\u0131\u015fma prensibi olduk\u00e7a basittir: Uygulama ba\u015flat\u0131ld\u0131\u011f\u0131nda veya belirli bir y\u00fck seviyesine ula\u015f\u0131ld\u0131\u011f\u0131nda, havuz \u00f6nceden belirli say\u0131da ba\u011flant\u0131y\u0131 PostgreSQL sunucusuna a\u00e7ar ve haz\u0131rda bekletir. Bir uygulama iste\u011fi geldi\u011finde ve veritaban\u0131 eri\u015fimi gerekti\u011finde:<\/p>\n<ol>\n<li>Uygulama, havuza bir ba\u011flant\u0131 talebi g\u00f6nderir.<\/li>\n<li>Havuz, mevcut ba\u011flant\u0131lardan birini uygulamaya verir. E\u011fer hi\u00e7 bo\u015f ba\u011flant\u0131 yoksa, havuzun politikas\u0131na g\u00f6re yeni bir ba\u011flant\u0131 a\u00e7abilir (e\u011fer izin veriliyorsa ve maksimum boyuta ula\u015f\u0131lmam\u0131\u015fsa) veya uygulamay\u0131 belirli bir s\u00fcre bekletebilir.<\/li>\n<li>Uygulama, ald\u0131\u011f\u0131 ba\u011flant\u0131 \u00fczerinden veritaban\u0131 i\u015flemlerini ger\u00e7ekle\u015ftirir.<\/li>\n<li>\u0130\u015flem bitti\u011finde, uygulama ba\u011flant\u0131y\u0131 havuza geri iade eder. Ba\u011flant\u0131 kapat\u0131lmaz, sadece tekrar kullan\u0131lmak \u00fczere havuza d\u00f6ner.<\/li>\n<\/ol>\n<p>Bu d\u00f6ng\u00fc sayesinde, ba\u011flant\u0131 a\u00e7ma\/kapama maliyetleri yaln\u0131zca havuzun ba\u015flang\u0131c\u0131nda veya \u00e7ok nadir durumlarda ortaya \u00e7\u0131kar. B\u00f6ylece uygulaman\u0131z\u0131n tepki s\u00fcresi iyile\u015fir, veritaban\u0131 \u00fczerindeki y\u00fck azal\u0131r ve genel sistem \u00f6l\u00e7eklenebilirli\u011fi artar. Ancak unutmamak gerekir ki, havuz boyutu ve timeout (zaman a\u015f\u0131m\u0131) ayarlar\u0131 gibi parametreler, bu faydalar\u0131n ne kadar hissedilece\u011fini do\u011frudan etkiler. \u0130\u015fte bu optimal dengeyi bulmak i\u00e7in y\u00fck testleri devreye girer.<\/p>\n<h3>k6 Y\u00fck Testi: Performans\u0131 \u00d6l\u00e7menin Modern Yolu Nedir?<\/h3>\n<p>k6, modern bir a\u00e7\u0131k kaynak y\u00fck testi arac\u0131d\u0131r ve Go dilinde yaz\u0131lm\u0131\u015f olmas\u0131na ra\u011fmen test betiklerini JavaScript ile yazman\u0131za olanak tan\u0131r. Bu, \u00f6zellikle web geli\u015ftiricileri i\u00e7in \u00f6\u011frenme e\u011frisini d\u00fc\u015f\u00fcr\u00fcr ve testlerin geli\u015ftirme s\u00fcre\u00e7lerine kolayca entegre edilmesini sa\u011flar. k6&#8217;y\u0131 di\u011fer y\u00fck testi ara\u00e7lar\u0131ndan ay\u0131ran temel \u00f6zellikler \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Geli\u015ftirici Odakl\u0131 Yakla\u015f\u0131m:<\/strong> Testleri kod olarak yazma (<code>test-as-code<\/code>) prensibiyle \u00e7al\u0131\u015f\u0131r. Bu, testlerin versiyon kontrol sistemlerine (Git gibi) dahil edilmesini, g\u00f6zden ge\u00e7irilmesini ve otomatik CI\/CD s\u00fcre\u00e7lerinde kullan\u0131lmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Y\u00fcksek Performans:<\/strong> Go dilinin getirdi\u011fi performans avantajlar\u0131 sayesinde, k6 tek bir makineden y\u00fcksek say\u0131da sanal kullan\u0131c\u0131 (Virtual User &#8211; VU) ve istek (Request) \u00fcretebilir. Bu, ger\u00e7ek d\u00fcnya y\u00fck senaryolar\u0131n\u0131 daha do\u011fru bir \u015fekilde sim\u00fcle etmenize olanak tan\u0131r.<\/li>\n<li><strong>Esneklik ve Geni\u015fletilebilirlik:<\/strong> JavaScript API&#8217;leri sayesinde karma\u015f\u0131k test senaryolar\u0131n\u0131 kolayca olu\u015fturabilirsiniz. Ayr\u0131ca \u00f6zel protokoller ve harici hizmetler i\u00e7in geni\u015fletilebilir mod\u00fcllere sahiptir.<\/li>\n<li><strong>Zengin Metrik Deste\u011fi:<\/strong> k6, yan\u0131t s\u00fcreleri (latency), istek say\u0131s\u0131 (RPS &#8211; Requests Per Second), hata oranlar\u0131 gibi standart metrikleri toplaman\u0131n yan\u0131 s\u0131ra, belirli e\u015fikler (thresholds) belirlemenize ve testin ba\u015far\u0131s\u0131z olmas\u0131 durumunda otomatik olarak uyar\u0131 vermesine olanak tan\u0131r.<\/li>\n<li><strong>Entegrasyon Kolayl\u0131\u011f\u0131:<\/strong> Prometheus, Grafana, Datadog gibi pop\u00fcler izleme ve g\u00f6zlemlenebilirlik ara\u00e7lar\u0131yla kolayca entegre olabilir, bu da test sonu\u00e7lar\u0131n\u0131 g\u00f6rselle\u015ftirmeyi ve analiz etmeyi \u00e7ok daha kolay hale getirir.<\/li>\n<\/ul>\n<p>k6 ile bir test ko\u015ftu\u011funuzda, sanal kullan\u0131c\u0131lar (VU&#8217;lar) belirledi\u011finiz bir senaryoyu tekrarlayan ger\u00e7ek kullan\u0131c\u0131 davran\u0131\u015flar\u0131n\u0131 taklit eder. \u00d6rne\u011fin, belirli bir URL&#8217;ye istek g\u00f6nderebilir, veritaban\u0131 sorgular\u0131 yapabilir veya bir i\u015flem ak\u0131\u015f\u0131n\u0131 (login, \u00fcr\u00fcn ekleme, checkout) tamamlayabilirler. Bu s\u00fcre\u00e7te k6, uygulaman\u0131z\u0131n bu y\u00fcke nas\u0131l tepki verdi\u011fini milisaniye hassasiyetinde kaydeder. Ba\u011flant\u0131 havuzu boyutu optimizasyonu ba\u011flam\u0131nda, k6&#8217;y\u0131 kullanarak farkl\u0131 havuz boyutlar\u0131n\u0131n uygulaman\u0131z\u0131n yan\u0131t s\u00fcresi, hata oran\u0131 ve veritaban\u0131 sunucusunun kaynak kullan\u0131m\u0131 \u00fczerindeki etkilerini sistematik olarak inceleyebiliriz. B\u00f6ylece, teorik bilgiyi pratik sonu\u00e7larla birle\u015ftirerek en iyi karar\u0131 verebiliriz.<\/p>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: PgBouncer gibi ba\u011flant\u0131 havuzu proxy&#8217;leri, uygulama taraf\u0131ndaki havuzlar\u0131n aksine, veritaban\u0131 sunucusunun ba\u011flant\u0131 limitini a\u015fmadan birden fazla uygulaman\u0131n ayn\u0131 veritaban\u0131n\u0131 kullanmas\u0131na olanak tan\u0131r. Bu, \u00e7ok hizmetli (microservices) mimarilerinde veya birden fazla uygulaman\u0131n tek bir veritaban\u0131na ba\u011fland\u0131\u011f\u0131 durumlarda \u00f6zellikle faydal\u0131d\u0131r.\n<\/div>\n<h2>Haz\u0131rl\u0131k A\u015famas\u0131: k6 ve Test Ortam\u0131m\u0131z\u0131 Nas\u0131l Kurar\u0131z?<\/h2>\n<p>Optimal PostgreSQL ba\u011flant\u0131 havuzu boyutunu bulmak i\u00e7in derinlemesine bir test s\u00fcreci ba\u015flatmadan \u00f6nce, gerekli ara\u00e7lar\u0131 kurmal\u0131 ve test ortam\u0131m\u0131z\u0131 haz\u0131rlamal\u0131y\u0131z. Bu b\u00f6l\u00fcm, k6&#8217;y\u0131 sisteminize kurmaktan basit bir PostgreSQL veritaban\u0131 ve test uygulamas\u0131 olu\u015fturmaya kadar her ad\u0131m\u0131 kapsayacakt\u0131r. Unutmay\u0131n, iyi bir haz\u0131rl\u0131k, do\u011fru ve g\u00fcvenilir test sonu\u00e7lar\u0131 alman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>k6 Kurulumu: Y\u00fck Test Arac\u0131m\u0131z\u0131 Haz\u0131rlama<\/h3>\n<p>k6&#8217;y\u0131 kurman\u0131n birka\u00e7 yolu vard\u0131r. En yayg\u0131n ve \u00f6nerilen y\u00f6ntemlerden biri Docker kullanmakt\u0131r, \u00e7\u00fcnk\u00fc bu, ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131n\u0131 en aza indirir. Alternatif olarak, do\u011frudan i\u015fletim sisteminize de kurabilirsiniz.<\/p>\n<h4>Docker ile k6 Kurulumu:<\/h4>\n<p>E\u011fer sisteminizde Docker kuruluysa, k6&#8217;y\u0131 \u00e7al\u0131\u015ft\u0131rmak \u00e7ok basittir. Genellikle sadece k6 Docker imaj\u0131n\u0131 \u00e7ekmeniz ve \u00e7al\u0131\u015ft\u0131rman\u0131z yeterlidir:<\/p>\n<pre><code>\ndocker pull grafana\/k6\n<\/pre>\n<p><\/code><\/p>\n<p>Testleri \u00e7al\u0131\u015ft\u0131rmak i\u00e7in her zaman Docker komutlar\u0131n\u0131 kullanaca\u011f\u0131z, bu da yerel kurulumdan kaynaklanabilecek uyumsuzluklar\u0131 ortadan kald\u0131r\u0131r. \u00d6rne\u011fin, bir test beti\u011fini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in:<\/p>\n<pre><code>\ndocker run -i --rm grafana\/k6 run - <script.js\n<\/pre>\n<p><\/code><\/p>\n<h4>Yerel k6 Kurulumu (macOS\/Linux i\u00e7in):<\/h4>\n<p>E\u011fer Docker kullanmak istemiyorsan\u0131z, k6'y\u0131 do\u011frudan kurabilirsiniz. macOS i\u00e7in Homebrew kullanmak en kolay yoldur:<\/p>\n<pre><code>\nbrew install k6\n<\/pre>\n<p><\/code><\/p>\n<p>Linux da\u011f\u0131t\u0131mlar\u0131 i\u00e7in farkl\u0131 kurulum y\u00f6ntemleri mevcuttur. \u00d6rne\u011fin, Debian\/Ubuntu tabanl\u0131 sistemler i\u00e7in:<\/p>\n<pre><code>\nsudo apt-key adv --keyserver hkp:\/\/keyserver.ubuntu.com:80 --recv-keys 379CE192D401AB61\necho \"deb https:\/\/dl.k6.io\/deb stable main\" | sudo tee \/etc\/apt\/sources.list.d\/k6.list\nsudo apt update\nsudo apt install k6\n<\/pre>\n<p><\/code><\/p>\n<p>Kurulumdan sonra, k6'n\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in s\u00fcr\u00fcm\u00fcn\u00fc kontrol edebilirsiniz:<\/p>\n<pre><code>\nk6 version\n<\/pre>\n<p><\/code><\/p>\n<h3>PostgreSQL Ortam\u0131 Olu\u015fturma: Test Veritaban\u0131m\u0131z\u0131 Ayarlama<\/h3>\n<p>Testlerimizi ger\u00e7ekle\u015ftirmek i\u00e7in bir PostgreSQL veritaban\u0131na ihtiyac\u0131m\u0131z var. En h\u0131zl\u0131 ve izole yol yine Docker kullanmakt\u0131r. Basit bir PostgreSQL sunucusu ve test i\u00e7in kullanaca\u011f\u0131m\u0131z bir veritaban\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>\ndocker run --name pg-test -e POSTGRES_DB=mydb -e POSTGRES_USER=myuser -e POSTGRES_PASSWORD=mypass -p 5432:5432 -d postgres:14\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>pg-test<\/code> ad\u0131nda bir PostgreSQL konteyneri ba\u015flat\u0131r, <code>mydb<\/code> ad\u0131nda bir veritaban\u0131, <code>myuser<\/code> ad\u0131nda bir kullan\u0131c\u0131 ve <code>mypass<\/code> \u015fifresiyle eri\u015filebilir hale getirir. Ayr\u0131ca, yerel 5432 portunu konteynerin 5432 portuna y\u00f6nlendirir. \u015eimdi bu veritaban\u0131nda basit bir tablo olu\u015ftural\u0131m ve birka\u00e7 veri ekleyelim:<\/p>\n<pre><code>\ndocker exec -it pg-test psql -U myuser -d mydb\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki komutla PostgreSQL konteynerine ba\u011flan\u0131n ve a\u015fa\u011f\u0131daki SQL komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\nCREATE TABLE products (\n    id SERIAL PRIMARY KEY,\n    name VARCHAR(255) NOT NULL,\n    price NUMERIC(10, 2) NOT NULL,\n    description TEXT\n);\n\nINSERT INTO products (name, price, description) VALUES\n('Laptop', 1200.00, 'G\u00fc\u00e7l\u00fc ve ta\u015f\u0131nabilir laptop'),\n('Ak\u0131ll\u0131 Telefon', 800.00, 'Son model ak\u0131ll\u0131 telefon'),\n('Kablosuz Kulakl\u0131k', 150.00, 'Y\u00fcksek kaliteli ses deneyimi');\n<\/pre>\n<p><\/code><\/p>\n<p>Veritaban\u0131 kurulumumuz art\u0131k haz\u0131r.<\/p>\n<h3>Basit Bir Test Uygulamas\u0131 ve Ba\u011flant\u0131 Havuzu Yap\u0131land\u0131rmas\u0131 (Node.js \u00d6rne\u011fi)<\/h3>\n<p>Testlerimizi yapabilmek i\u00e7in, veritaban\u0131na ba\u011flanan ve ba\u011flant\u0131 havuzu kullanan basit bir uygulamaya ihtiyac\u0131m\u0131z var. Node.js ve <code>pg-pool<\/code> k\u00fct\u00fcphanesini kullanarak \u00f6rnek bir uygulama olu\u015ftural\u0131m. Bu uygulama, HTTP isteklerine yan\u0131t olarak veritaban\u0131ndan veri \u00e7ekecek.<\/p>\n<p>\u00d6ncelikle yeni bir Node.js projesi olu\u015fturun ve gerekli paketleri y\u00fckleyin:<\/p>\n<pre><code>\nmkdir connection-pool-app\ncd connection-pool-app\nnpm init -y\nnpm install express pg pg-pool\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi <code>app.js<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki kodu yap\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\n\/\/ app.js\nconst express = require('express');\nconst { Pool } = require('pg');\n\nconst app = express();\nconst port = 3000;\n\n\/\/ Veritaban\u0131 ba\u011flant\u0131 havuzu yap\u0131land\u0131rmas\u0131\n\/\/ Bu de\u011feri testler s\u0131ras\u0131nda de\u011fi\u015ftirece\u011fiz\nconst pool = new Pool({\n    user: 'myuser',\n    host: 'localhost', \/\/ Docker kullan\u0131yorsan\u0131z 'host.docker.internal' veya veritaban\u0131 servisi ad\u0131\n    database: 'mydb',\n    password: 'mypass',\n    port: 5432,\n    max: 10, \/\/ Buras\u0131 ba\u011flant\u0131 havuzu boyutumuz\n    idleTimeoutMillis: 30000,\n    connectionTimeoutMillis: 2000,\n});\n\n\/\/ Veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 izlemek i\u00e7in event listener\npool.on('connect', () => {\n    console.log('Veritaban\u0131na yeni ba\u011flant\u0131 a\u00e7\u0131ld\u0131.');\n});\n\npool.on('error', (err) => {\n    console.error('Beklenmedik bir hatayla kar\u015f\u0131la\u015f\u0131ld\u0131:', err.message);\n});\n\n\/\/ Basit bir API rotas\u0131\napp.get('\/products', async (req, res) => {\n    try {\n        const client = await pool.connect(); \/\/ Havuzdan ba\u011flant\u0131 al\n        const result = await client.query('SELECT * FROM products');\n        client.release(); \/\/ Ba\u011flant\u0131y\u0131 havuza geri ver\n        res.json(result.rows);\n    } catch (err) {\n        console.error('Sorgu hatas\u0131:', err.message);\n        res.status(500).send('Veritaban\u0131 sorgusunda bir hata olu\u015ftu.');\n    }\n});\n\napp.get('\/', (req, res) => {\n    res.send('Ba\u011flant\u0131 havuzu test uygulamas\u0131 \u00e7al\u0131\u015f\u0131yor!');\n});\n\napp.listen(port, () => {\n    console.log(<code>Uygulama http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n    console.log(<code>Mevcut ba\u011flant\u0131 havuzu boyutu: ${pool.options.max}<\/code>);\n});\n<\/pre>\n<p><\/code><\/p>\n<p>E\u011fer uygulaman\u0131z\u0131 Docker'da \u00e7al\u0131\u015ft\u0131racaksan\u0131z, <code>host: 'localhost'<\/code> yerine <code>host: 'host.docker.internal'<\/code> kullanman\u0131z veya veritaban\u0131 konteynerinizin servisini kullanman\u0131z gerekebilir. \u015eimdi bu uygulamay\u0131 ba\u015flat\u0131n:<\/p>\n<pre><code>\nnode app.js\n<\/pre>\n<p><\/code><\/p>\n<p>Art\u0131k k6 ile y\u00fck testleri yapmaya ve ba\u011flant\u0131 havuzu boyutunun performans \u00fczerindeki etkisini g\u00f6zlemlemeye haz\u0131r\u0131z. Bu yap\u0131land\u0131rma, bize farkl\u0131 havuz boyutlar\u0131n\u0131 deneyerek ger\u00e7ek d\u00fcnya y\u00fck ko\u015fullar\u0131nda uygulaman\u0131n nas\u0131l tepki verdi\u011fini anlama f\u0131rsat\u0131 sunacak.<\/p>\n<h2>Uygulamal\u0131 Ad\u0131mlar: Optimal Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Nas\u0131l Test Ederiz?<\/h2>\n<p>Haz\u0131rl\u0131k a\u015famas\u0131n\u0131 tamamlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi s\u0131ra geldi as\u0131l uygulamal\u0131 k\u0131sma: k6 ile y\u00fck testlerini ba\u015flatarak PostgreSQL ba\u011flant\u0131 havuzu boyutunu ad\u0131m ad\u0131m optimize etmeye. Bu b\u00f6l\u00fcm, k6 test senaryolar\u0131n\u0131 olu\u015fturmaktan, farkl\u0131 havuz boyutlar\u0131n\u0131 denemeye ve veritaban\u0131 metriklerini izlemeye kadar t\u00fcm s\u00fcre\u00e7leri detayland\u0131racakt\u0131r. Amac\u0131m\u0131z, uygulaman\u0131z\u0131n en verimli \u015fekilde \u00e7al\u0131\u015faca\u011f\u0131 \"tatl\u0131 noktay\u0131\" bulmakt\u0131r.<\/p>\n<h3>Ad\u0131m 1: Temel k6 Test Senaryosu Olu\u015fturma<\/h3>\n<p>\u00d6ncelikle, daha \u00f6nce haz\u0131rlad\u0131\u011f\u0131m\u0131z Node.js uygulamam\u0131z\u0131n <code>\/products<\/code> endpoint'ini hedef alan basit bir k6 test beti\u011fi olu\u015ftural\u0131m. Bu betik, sanal kullan\u0131c\u0131lar\u0131n (VU'lar) bu endpoint'e istek g\u00f6ndermesini sim\u00fcle edecek.<\/p>\n<p><code>test_products.js<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki kodu ekleyin:<\/p>\n<pre><code>\n\/\/ test_products.js\nimport http from 'k6\/http';\nimport { check, sleep } from 'k6';\n\nexport const options = {\n    vus: 10,      \/\/ Ba\u015flang\u0131\u00e7 sanal kullan\u0131c\u0131 say\u0131s\u0131\n    duration: '30s', \/\/ Testin s\u00fcresi\n    thresholds: {\n        'http_req_duration': ['p(95)<500'], \/\/ %95 istek 500ms alt\u0131nda olmal\u0131\n        'errors': ['rate<0.01'],             \/\/ Hata oran\u0131 %1'in alt\u0131nda olmal\u0131\n    },\n};\n\nexport default function () {\n    const res = http.get('http:\/\/localhost:3000\/products');\n    check(res, {\n        'status is 200': (r) => r.status === 200,\n        'response body contains products': (r) => r.body.includes('Laptop') \/\/ Basit bir i\u00e7erik kontrol\u00fc\n    });\n    sleep(1); \/\/ Her istek aras\u0131nda 1 saniye bekleme\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu betik, 10 sanal kullan\u0131c\u0131 ile 30 saniye boyunca <code>http:\/\/localhost:3000\/products<\/code> adresine istek g\u00f6nderecek. <code>sleep(1)<\/code>, her iste\u011fin aras\u0131nda bir saniyelik bir duraklama ekleyerek daha ger\u00e7ek\u00e7i bir kullan\u0131c\u0131 davran\u0131\u015f\u0131n\u0131 sim\u00fcle eder. Ayr\u0131ca, yan\u0131t s\u00fcreleri ve hata oranlar\u0131 i\u00e7in e\u015fikler (thresholds) belirledik; bu, testin sonunda performans\u0131n beklentileri kar\u015f\u0131lay\u0131p kar\u015f\u0131lamad\u0131\u011f\u0131n\u0131 otomatik olarak kontrol etmemizi sa\u011flar.<\/p>\n<p>\u015eimdi bu testi \u00e7al\u0131\u015ft\u0131ral\u0131m (uygulaman\u0131z\u0131n arka planda \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun):<\/p>\n<pre><code>\nk6 run test_products.js\n<\/pre>\n<p><\/code><\/p>\n<p>E\u011fer Docker ile k6 kullan\u0131yorsan\u0131z, uygulaman\u0131z Docker i\u00e7inde de\u011filse ve 'localhost' yerine 'host.docker.internal' kullanman\u0131z gerekiyorsa, komutu \u015f\u00f6yle de\u011fi\u015ftirebilirsiniz:<\/p>\n<pre><code>\ndocker run -i --rm -e K6_HOST_IP=$(ifconfig | grep \"inet \" | grep -v 127.0.0.1 | awk '{print $2}' | head -n 1) grafana\/k6 run - < test_products.js\n<\/pre>\n<p><\/code><\/p>\n<p>Veya daha basiti, e\u011fer uygulaman\u0131z yerel makinenizde \u00e7al\u0131\u015f\u0131yorsa, k6'y\u0131 do\u011frudan \u00e7al\u0131\u015ft\u0131rabilirsiniz. E\u011fer uygulaman\u0131z da Docker'daysa, ayn\u0131 Docker a\u011f\u0131na dahil etmeniz gerekir. En basit senaryo i\u00e7in, Node.js uygulaman\u0131z\u0131n yerel makinede \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve k6'n\u0131n da yerel makinede veya Docker ile <code>--add-host host.docker.internal:host-gateway<\/code> parametresi ile \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 varsayal\u0131m.<\/p>\n<p>Testin \u00e7\u0131kt\u0131s\u0131nda, isteklerin ortalama yan\u0131t s\u00fcreleri, medyan, p90, p95 de\u011ferleri ve hata oranlar\u0131 gibi \u00f6nemli metrikleri g\u00f6receksiniz. Bu, bizim ilk baz performans \u00f6l\u00e7\u00fcm\u00fcm\u00fcz olacak.<\/p>\n<h3>Ad\u0131m 2: Ba\u011flant\u0131 Havuzu Boyutunu De\u011fi\u015ftirme ve \u0130zleme<\/h3>\n<p>\u015eimdi kritik ad\u0131ma geliyoruz: Node.js uygulamam\u0131zdaki ba\u011flant\u0131 havuzu boyutunu (<code>pool.max<\/code> de\u011feri) de\u011fi\u015ftirerek k6 testlerini tekrar tekrar \u00e7al\u0131\u015ft\u0131raca\u011f\u0131z. Her bir denemede, hem k6'n\u0131n raporlad\u0131\u011f\u0131 performans metriklerini hem de veritaban\u0131 sunucusunun kaynak kullan\u0131m\u0131n\u0131 dikkatle izleyece\u011fiz.<\/p>\n<h4>Deneme 1: K\u00fc\u00e7\u00fck Bir Ba\u011flant\u0131 Havuzu (\u00d6rn: <code>max: 5<\/code>)<\/h4>\n<p><code>app.js<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve <code>max<\/code> de\u011ferini <code>5<\/code> olarak de\u011fi\u015ftirin. Uygulamay\u0131 yeniden ba\u015flat\u0131n.<\/p>\n<pre><code>\n\/\/ app.js\n\/\/ ...\nconst pool = new Pool({\n    \/\/ ...\n    max: 5, \/\/ Ba\u011flant\u0131 havuzu boyutu\n    \/\/ ...\n});\n\/\/ ...\n<\/pre>\n<p><\/code><\/p>\n<p>Uygulama yeniden ba\u015flad\u0131ktan sonra, k6 test beti\u011fimizi (<code>test_products.js<\/code>) daha y\u00fcksek sanal kullan\u0131c\u0131 say\u0131lar\u0131yla, \u00f6rne\u011fin <code>vus: 50<\/code> veya <code>vus: 100<\/code> ile \u00e7al\u0131\u015ft\u0131ral\u0131m. \u00c7\u00fcnk\u00fc k\u00fc\u00e7\u00fck havuz boyutunun etkilerini ancak y\u00fcksek y\u00fck alt\u0131nda g\u00f6rebiliriz. <code>test_products.js<\/code> dosyas\u0131ndaki <code>vus<\/code> de\u011ferini de\u011fi\u015ftirin:<\/p>\n<pre><code>\n\/\/ test_products.js\nexport const options = {\n    vus: 100, \/\/ Sanal kullan\u0131c\u0131 say\u0131s\u0131n\u0131 art\u0131r\n    duration: '30s',\n    \/\/ ...\n};\n<\/pre>\n<p><\/code><\/p>\n<p>Testi \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\nk6 run test_products.js\n<\/pre>\n<p><\/code><\/p>\n<p>Bu testi \u00e7al\u0131\u015ft\u0131r\u0131rken, ayn\u0131 zamanda PostgreSQL sunucusunun durumunu da izlememiz gerekiyor. Bunu yapman\u0131n en basit yolu, ba\u015fka bir terminalde <code>psql<\/code> ile veritaban\u0131na ba\u011flan\u0131p <code>pg_stat_activity<\/code> tablosunu sorgulamakt\u0131r:<\/p>\n<pre><code>\nwatch -n 1 \"docker exec -it pg-test psql -U myuser -d mydb -c 'SELECT datname, usename, state, backend_type, count(*) FROM pg_stat_activity GROUP BY datname, usename, state, backend_type;'\"\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, her saniye aktif ba\u011flant\u0131lar\u0131 ve durumlar\u0131n\u0131 g\u00f6sterecektir. \u00d6zellikle <code>state: idle in transaction<\/code> (i\u015flemde bo\u015fta) veya <code>waiting<\/code> (bekleyen) gibi durumlar\u0131n say\u0131s\u0131na dikkat edin. K\u00fc\u00e7\u00fck bir havuzla, \u00e7ok say\u0131da ba\u011flant\u0131n\u0131n bekleme durumunda oldu\u011funu veya <code>max<\/code> de\u011ferine ula\u015f\u0131ld\u0131\u011f\u0131nda uygulaman\u0131n hata vermeye ba\u015flad\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz.<\/p>\n<h4>Deneme 2: Orta Boyutta Bir Ba\u011flant\u0131 Havuzu (\u00d6rn: <code>max: 20<\/code>)<\/h4>\n<p>\u015eimdi <code>app.js<\/code> dosyas\u0131ndaki <code>max<\/code> de\u011ferini <code>20<\/code> olarak de\u011fi\u015ftirin. Uygulamay\u0131 yeniden ba\u015flat\u0131n ve ayn\u0131 k6 testini tekrar \u00e7al\u0131\u015ft\u0131r\u0131n. PostgreSQL ba\u011flant\u0131lar\u0131n\u0131 tekrar izleyin. Yan\u0131t s\u00fcrelerinde bir iyile\u015fme ve bekleme durumundaki ba\u011flant\u0131 say\u0131s\u0131nda bir azalma g\u00f6rmelisiniz. Veritaban\u0131 CPU ve bellek kullan\u0131m\u0131n\u0131 da izlemek \u00f6nemlidir (\u00f6rne\u011fin <code>docker stats pg-test<\/code> ile).<\/p>\n<h4>Deneme 3: B\u00fcy\u00fck Bir Ba\u011flant\u0131 Havuzu (\u00d6rn: <code>max: 100<\/code>)<\/h4>\n<p><code>max<\/code> de\u011ferini <code>100<\/code> gibi daha b\u00fcy\u00fck bir de\u011fere y\u00fckseltin. Uygulamay\u0131 yeniden ba\u015flat\u0131n ve k6 testini \u00e7al\u0131\u015ft\u0131r\u0131n. Bu noktada, yan\u0131t s\u00fcreleri daha da iyile\u015febilir, ancak veritaban\u0131 sunucusunun CPU ve bellek kullan\u0131m\u0131nda gereksiz bir art\u0131\u015f fark edebilirsiniz. \u00c7ok fazla bo\u015fta bekleyen ba\u011flant\u0131 (<code>idle<\/code> state) veritaban\u0131 kaynaklar\u0131n\u0131 bo\u015fa harcad\u0131\u011f\u0131 anlam\u0131na gelir.<\/p>\n<h4>Optimal Boyutu Belirleme<\/h4>\n<p>Bu denemelerden elde etti\u011finiz k6 metriklerini (\u00f6zellikle <code>http_req_duration<\/code> ve <code>errors<\/code>) ve PostgreSQL sunucusunun kaynak kullan\u0131m\u0131n\u0131 kar\u015f\u0131la\u015ft\u0131rarak bir tablo olu\u015fturun. Amac\u0131m\u0131z, en d\u00fc\u015f\u00fck yan\u0131t s\u00fcresi ve hata oran\u0131yla birlikte, veritaban\u0131 sunucusunun kaynaklar\u0131n\u0131 (CPU, RAM) en verimli \u015fekilde kullanan ba\u011flant\u0131 havuzu boyutunu bulmakt\u0131r. Genellikle, belirli bir noktadan sonra ba\u011flant\u0131 havuzu boyutunu art\u0131rmak, performans\u0131 art\u0131rmaz, aksine veritaban\u0131 sunucusundaki ba\u011flam de\u011fi\u015ftirme (context switching) maliyetleri ve kilitlenme (locking) sorunlar\u0131 nedeniyle k\u00f6t\u00fcle\u015ftirir.<\/p>\n<p>Bu s\u00fcre\u00e7, uygulaman\u0131z\u0131n i\u015f y\u00fck\u00fc ve veritaban\u0131 sunucunuzun donan\u0131m \u00f6zelliklerine g\u00f6re farkl\u0131l\u0131k g\u00f6sterecektir. Bu nedenle, kendi senaryonuzda bu ad\u0131mlar\u0131 tekrarlamak ve dikkatli g\u00f6zlemler yapmak hayati \u00f6nem ta\u015f\u0131r. Optimal <strong>PostgreSQL ba\u011flant\u0131 havuzu<\/strong> boyutu, genel sistem sa\u011fl\u0131\u011f\u0131n\u0131 ve performans\u0131n\u0131 do\u011frudan etkiler.<\/p>\n<h2>Verileri Analiz Etme: Performans Metriklerini Nas\u0131l Yorumlamal\u0131y\u0131z?<\/h2>\n<p>Y\u00fck testleri ger\u00e7ekle\u015ftirmek, denklemin sadece bir yar\u0131s\u0131d\u0131r. Ger\u00e7ek fayda, testlerden elde edilen verileri do\u011fru bir \u015fekilde analiz etmek ve anlaml\u0131 sonu\u00e7lar \u00e7\u0131karmaktan gelir. Bu b\u00f6l\u00fcm, k6'n\u0131n sa\u011flad\u0131\u011f\u0131 metrikleri, veritaban\u0131 izleme verilerini ve di\u011fer g\u00f6zlemleri nas\u0131l yorumlayaca\u011f\u0131n\u0131z\u0131 a\u00e7\u0131klayarak optimal <strong>PostgreSQL ba\u011flant\u0131 havuzu<\/strong> boyutunu belirlemenize yard\u0131mc\u0131 olacakt\u0131r. Unutmay\u0131n, ham veriler sadece say\u0131lard\u0131r; onlar\u0131 bilgiye d\u00f6n\u00fc\u015ft\u00fcrmek sizin elinizde.<\/p>\n<h3>k6 Raporlar\u0131n\u0131 Okuma: Hangi Metrikler Neyi Anlat\u0131r?<\/h3>\n<p>Bir k6 testi \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, konsol \u00e7\u0131kt\u0131s\u0131nda veya se\u00e7ti\u011finiz bir raporlama arac\u0131nda (Prometheus\/Grafana gibi) \u00e7e\u015fitli metrikler g\u00f6r\u00fcrs\u00fcn\u00fcz. Ba\u011flant\u0131 havuzu optimizasyonu i\u00e7in en kritik olanlar \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong><code>http_req_duration<\/code> (\u0130stek S\u00fcresi):<\/strong> Bu, bir HTTP iste\u011finin g\u00f6nderilip yan\u0131t\u0131n al\u0131nmas\u0131 aras\u0131nda ge\u00e7en toplam s\u00fcreyi g\u00f6sterir. Ortalama (<code>avg<\/code>), medyan (<code>med<\/code>), %90'l\u0131k (<code>p(90)<\/code>) ve %95'lik (<code>p(95)<\/code>) y\u00fczdelik dilim de\u011ferleri \u00e7ok \u00f6nemlidir. \u00d6zellikle <code>p(95)<\/code> de\u011feri, kullan\u0131c\u0131lar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011funun ne kadar h\u0131zl\u0131 bir yan\u0131t ald\u0131\u011f\u0131n\u0131 g\u00f6sterir. E\u011fer bu de\u011ferler, havuz boyutunu art\u0131rd\u0131k\u00e7a d\u00fc\u015f\u00fcyor, ancak belirli bir noktadan sonra artmaya ba\u015fl\u0131yorsa, bu optimal noktay\u0131 ge\u00e7mi\u015f olabilece\u011finizin bir i\u015faretidir.<\/li>\n<li><strong><code>http_reqs<\/code> (\u0130stek Say\u0131s\u0131) \/ <code>rps<\/code> (Requests Per Second):<\/strong> Test s\u00fcresince tamamlanan toplam istek say\u0131s\u0131n\u0131 veya saniyede ortalama istek say\u0131s\u0131n\u0131 (throughput) g\u00f6sterir. Ba\u011flant\u0131 havuzu boyutunu art\u0131rd\u0131k\u00e7a bu de\u011ferin artmas\u0131n\u0131 beklersiniz, \u00e7\u00fcnk\u00fc daha fazla e\u015fzamanl\u0131 istek i\u015flenebilir. Ancak, belirli bir noktadan sonra art\u0131\u015f durur veya d\u00fc\u015ferse, bu veritaban\u0131 veya uygulaman\u0131n ba\u015fka bir darbo\u011faza ula\u015ft\u0131\u011f\u0131n\u0131 g\u00f6sterir.<\/li>\n<li><strong><code>errors<\/code> (Hata Oran\u0131):<\/strong> Ba\u015far\u0131s\u0131z olan isteklerin y\u00fczdesini g\u00f6sterir. K\u00fc\u00e7\u00fck bir havuz boyutunda ve y\u00fcksek y\u00fck alt\u0131nda, veritaban\u0131 ba\u011flant\u0131 havuzunun dolmas\u0131 nedeniyle uygulaman\u0131z ba\u011flant\u0131 hatalar\u0131 (\u00f6rne\u011fin <code>timeout<\/code>) f\u0131rlatabilir. Optimal bir havuz boyutunda, hata oran\u0131n\u0131n s\u0131f\u0131ra yak\u0131n olmas\u0131 beklenir.<\/li>\n<li><strong><code>vus<\/code> \/ <code>vus_max<\/code> (Sanal Kullan\u0131c\u0131lar):<\/strong> Test s\u0131ras\u0131nda ka\u00e7 sanal kullan\u0131c\u0131n\u0131n aktif oldu\u011funu g\u00f6sterir. Bu metrikler, uygulaman\u0131z\u0131n belirli bir kullan\u0131c\u0131 y\u00fck\u00fc alt\u0131nda nas\u0131l performans g\u00f6sterdi\u011fini izlemenize yard\u0131mc\u0131 olur.<\/li>\n<\/ol>\n<p>Bu metrikleri farkl\u0131 havuz boyutlar\u0131 i\u00e7in bir tablo halinde kar\u015f\u0131la\u015ft\u0131rmak, trendleri g\u00f6rmenizi kolayla\u015ft\u0131racakt\u0131r.<\/p>\n<h3>Veritaban\u0131 Metrikleri: PostgreSQL Bize Ne S\u00f6yl\u00fcyor?<\/h3>\n<p>k6 metrikleri, uygulaman\u0131z\u0131n d\u0131\u015far\u0131dan nas\u0131l g\u00f6r\u00fcnd\u00fc\u011f\u00fcn\u00fc anlat\u0131rken, veritaban\u0131 metrikleri ise i\u00e7eride neler olup bitti\u011fini g\u00f6sterir. PostgreSQL'den toplayabilece\u011finiz ana metrikler \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong>CPU Kullan\u0131m\u0131:<\/strong> Veritaban\u0131 sunucusunun CPU kullan\u0131m\u0131, \u00e7ok fazla ba\u011flant\u0131 veya yo\u011fun sorgular nedeniyle artabilir. \u00c7ok y\u00fcksek CPU kullan\u0131m\u0131, veritaban\u0131n\u0131n sorgular\u0131 i\u015flemek yerine ba\u011flant\u0131lar\u0131 y\u00f6netmekle me\u015fgul olabilece\u011fi anlam\u0131na gelebilir. Optimal havuz boyutunda, CPU kullan\u0131m\u0131n\u0131n belirli bir aral\u0131kta stabil kalmas\u0131 beklenir.<\/li>\n<li><strong>Bellek (RAM) Kullan\u0131m\u0131:<\/strong> Her aktif ba\u011flant\u0131 belirli bir bellek t\u00fcketir. Ba\u011flant\u0131 havuzu boyutu \u00e7ok b\u00fcy\u00fck oldu\u011funda, veritaban\u0131 sunucusunun belle\u011fi gereksiz yere \u015fi\u015febilir, bu da disk G\/\u00c7'ye (swapping) yol a\u00e7arak performans\u0131 d\u00fc\u015f\u00fcrebilir.<\/li>\n<li><strong>Aktif Ba\u011flant\u0131 Say\u0131s\u0131 (<code>pg_stat_activity<\/code>):<\/strong> <code>SELECT count(*) FROM pg_stat_activity WHERE state = 'active';<\/code> sorgusuyla aktif \u00e7al\u0131\u015fan sorgu say\u0131s\u0131n\u0131 izleyebilirsiniz. <code>state = 'idle in transaction'<\/code> ise, bir i\u015flemin ba\u015flad\u0131\u011f\u0131n\u0131 ancak hen\u00fcz tamamlanmad\u0131\u011f\u0131n\u0131 ve ba\u011flant\u0131n\u0131n bo\u015fta bekledi\u011fini g\u00f6sterir. \u00c7ok say\u0131da <code>idle in transaction<\/code> veya <code>waiting<\/code> ba\u011flant\u0131, uygulaman\u0131z\u0131n ba\u011flant\u0131lar\u0131 gerekti\u011fi gibi serbest b\u0131rakmad\u0131\u011f\u0131n\u0131 veya veritaban\u0131nda kilitlenme (locking) sorunlar\u0131 oldu\u011funu i\u015faret edebilir.<\/li>\n<li><strong>Sorgu S\u00fcreleri:<\/strong> Yava\u015f sorgular, ba\u011flant\u0131 havuzu boyutu ne olursa olsun performans\u0131 d\u00fc\u015f\u00fcr\u00fcr. <code>pg_stat_statements<\/code> gibi uzant\u0131lar\u0131 kullanarak en yava\u015f sorgular\u0131 belirleyin ve optimize edin.<\/li>\n<li><strong>Kilitlenmeler (Locks):<\/strong> <code>pg_locks<\/code> tablosu, veritaban\u0131ndaki kilit durumlar\u0131n\u0131 g\u00f6sterir. Y\u00fcksek y\u00fck ve \u00e7ok say\u0131da e\u015fzamanl\u0131 ba\u011flant\u0131, kilitlenme sorunlar\u0131n\u0131 tetikleyebilir ve bu da sorgular\u0131n yava\u015flamas\u0131na veya tamamen durmas\u0131na neden olabilir.<\/li>\n<\/ol>\n<p>Bu metrikleri izlemek i\u00e7in Grafana ve Prometheus gibi ara\u00e7lar kullanmak, g\u00f6rselle\u015ftirmeyi ve trendleri anlamay\u0131 \u00e7ok daha kolay hale getirecektir. Her havuz boyutu denemesinden sonra bu metriklerin nas\u0131l de\u011fi\u015fti\u011fini not al\u0131n.<\/p>\n<h3>Optimal Noktay\u0131 Belirleme: M\u00fckemmel Dengeyi Nas\u0131l Bulaca\u011f\u0131z?<\/h3>\n<p>Optimal ba\u011flant\u0131 havuzu boyutu, genellikle k6'n\u0131n raporlad\u0131\u011f\u0131 yan\u0131t s\u00fcreleri ve RPS de\u011ferlerinin en iyi oldu\u011fu, ayn\u0131 zamanda veritaban\u0131 sunucusunun CPU ve bellek kullan\u0131m\u0131n\u0131n makul seviyelerde kald\u0131\u011f\u0131 noktad\u0131r. Bir \u00f6rnek tablo olu\u015ftural\u0131m:<\/p>\n<table>\n<thead>\n<tr>\n<th>Ba\u011flant\u0131 Havuzu Boyutu (max)<\/th>\n<th>k6 p(95) Yan\u0131t S\u00fcresi (ms)<\/th>\n<th>k6 RPS<\/th>\n<th>k6 Hata Oran\u0131 (%)<\/th>\n<th>Veritaban\u0131 CPU Kullan\u0131m\u0131 (%)<\/th>\n<th>Veritaban\u0131 Bellek Kullan\u0131m\u0131 (MB)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>5<\/td>\n<td>1200<\/td>\n<td>50<\/td>\n<td>15<\/td>\n<td>40<\/td>\n<td>200<\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td>450<\/td>\n<td>180<\/td>\n<td>0<\/td>\n<td>60<\/td>\n<td>250<\/td>\n<\/tr>\n<tr>\n<td>20<\/td>\n<td>280<\/td>\n<td>350<\/td>\n<td>0<\/td>\n<td>75<\/td>\n<td>320<\/td>\n<\/tr>\n<tr>\n<td>30<\/td>\n<td>270<\/td>\n<td>360<\/td>\n<td>0<\/td>\n<td>85<\/td>\n<td>400<\/td>\n<\/tr>\n<tr>\n<td>40<\/td>\n<td>310<\/td>\n<td>340<\/td>\n<td>2<\/td>\n<td>95<\/td>\n<td>550<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Bu \u00f6rnek tabloya bakarsak:<\/p>\n<ul>\n<li>Havuz boyutu 5 iken, yan\u0131t s\u00fcreleri \u00e7ok y\u00fcksek ve hata oran\u0131 kabul edilemez. Uygulama darbo\u011faz ya\u015f\u0131yor.<\/li>\n<li>Havuz boyutu 10'a \u00e7\u0131kt\u0131\u011f\u0131nda, performans \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015fiyor, hatalar s\u0131f\u0131ra d\u00fc\u015f\u00fcyor.<\/li>\n<li>Havuz boyutu 20'de, yan\u0131t s\u00fcreleri daha da d\u00fc\u015f\u00fcyor ve RPS art\u0131yor. Bu, daha fazla e\u015fzamanl\u0131 i\u015flemi verimli bir \u015fekilde y\u00f6netebildi\u011fimiz anlam\u0131na geliyor.<\/li>\n<li>Havuz boyutu 30'da, yan\u0131t s\u00fcreleri neredeyse ayn\u0131 kal\u0131rken, RPS \u00e7ok az art\u0131yor. Ancak CPU ve bellek kullan\u0131m\u0131 daha belirgin bir \u015fekilde y\u00fckseliyor. Bu, marjinal getirilerin azald\u0131\u011f\u0131 ve kaynak t\u00fcketiminin artt\u0131\u011f\u0131 bir noktaya ula\u015ft\u0131\u011f\u0131m\u0131z\u0131 g\u00f6steriyor.<\/li>\n<li>Havuz boyutu 40'a \u00e7\u0131kt\u0131\u011f\u0131nda, yan\u0131t s\u00fcreleri tekrar y\u00fckseliyor ve hatta hatalar ortaya \u00e7\u0131k\u0131yor. CPU kullan\u0131m\u0131 %95'e f\u0131rl\u0131yor ve bellek t\u00fcketimi de art\u0131yor. Bu, veritaban\u0131 sunucusunun art\u0131k bu kadar \u00e7ok e\u015fzamanl\u0131 ba\u011flant\u0131y\u0131 y\u00f6netmekte zorland\u0131\u011f\u0131n\u0131 ve performans\u0131n d\u00fc\u015ft\u00fc\u011f\u00fcn\u00fc a\u00e7\u0131k\u00e7a g\u00f6steriyor.<\/li>\n<\/ul>\n<p>Bu senaryoda, <strong>optimal ba\u011flant\u0131 havuzu boyutu 20 ile 30 aras\u0131nda bir yerde olabilir<\/strong>. 20, iyi bir performans sunarken kaynaklar\u0131 daha verimli kullan\u0131yor gibi duruyor. 30'da ise k\u00fc\u00e7\u00fck bir performans art\u0131\u015f\u0131 i\u00e7in daha fazla kaynak t\u00fcketiliyor. Uygulaman\u0131z\u0131n tolerans\u0131na ve altyap\u0131n\u0131z\u0131n kapasitesine ba\u011fl\u0131 olarak, bu aral\u0131ktaki bir de\u011feri se\u00e7erek en iyi dengeyi bulabilirsiniz. Ancak bu t\u00fcr bir analizi kendi verilerinizle yapmak, ger\u00e7ek d\u00fcnya senaryonuz i\u00e7in en do\u011fru sonucu verecektir.<\/p>\n<h2>Vaka Analizi: B\u00fcy\u00fck Bir E-ticaret Uygulamas\u0131 \u0130\u00e7in Ba\u011flant\u0131 Havuzu Optimizasyonu<\/h2>\n<p>Teorik bilgileri ve ad\u0131m ad\u0131m rehberleri geride b\u0131rakt\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi edindi\u011fimiz bilgileri ger\u00e7ek d\u00fcnyadan bir senaryoyla peki\u015ftirelim. Bu vaka analizi, \"Pazaristan\" ad\u0131nda, yo\u011fun trafi\u011fe sahip bir e-ticaret uygulamas\u0131n\u0131n <strong>PostgreSQL ba\u011flant\u0131 havuzu<\/strong> optimizasyon s\u00fcrecini ve k6 y\u00fck testlerinin bu s\u00fcre\u00e7teki kritik rol\u00fcn\u00fc detayland\u0131racak.<\/p>\n<h3>Senaryo: Pazaristan'\u0131n Performans Sorunlar\u0131<\/h3>\n<p>Pazaristan, milyonlarca \u00fcr\u00fcn ve on binlerce e\u015fzamanl\u0131 kullan\u0131c\u0131y\u0131 bar\u0131nd\u0131ran pop\u00fcler bir online al\u0131\u015fveri\u015f platformudur. Uygulama, g\u00fc\u00e7l\u00fc bir Node.js arka ucu ve arkas\u0131nda PostgreSQL veritaban\u0131n\u0131 kullanmaktad\u0131r. Son d\u00f6nemde, \u00f6zellikle b\u00fcy\u00fck kampanya d\u00f6nemlerinde ve hafta sonu yo\u011funluklar\u0131nda, kullan\u0131c\u0131lar uygulaman\u0131n yava\u015flad\u0131\u011f\u0131ndan, bazen de \"hizmet kullan\u0131lam\u0131yor\" hatalar\u0131yla kar\u015f\u0131la\u015ft\u0131klar\u0131ndan \u015fikayet etmeye ba\u015flad\u0131lar. Performans metrikleri incelendi\u011finde, API yan\u0131t s\u00fcrelerinin (latency) belirgin \u015fekilde artt\u0131\u011f\u0131 ve hata oranlar\u0131n\u0131n beklenmedik \u015fekilde y\u00fckseldi\u011fi g\u00f6zlemlendi.<\/p>\n<h4>Mevcut Durum ve \u0130lk Varsay\u0131mlar:<\/h4>\n<p>Pazaristan'\u0131n arka u\u00e7 uygulamas\u0131, <code>pg-pool<\/code> k\u00fct\u00fcphanesini kullan\u0131yor ve varsay\u0131lan olarak ba\u011flant\u0131 havuzu boyutu (<code>max<\/code>) <strong>10<\/strong> olarak ayarl\u0131yd\u0131. Veritaban\u0131 sunucusu, 8 CPU \u00e7ekirde\u011fine ve 32 GB RAM'e sahip g\u00fc\u00e7l\u00fc bir bulut sunucusuydu. \u0130lk incelemelerde, veritaban\u0131 sunucusunun CPU kullan\u0131m\u0131n\u0131n %90'\u0131n \u00fczerine \u00e7\u0131kt\u0131\u011f\u0131, ancak bellek kullan\u0131m\u0131n\u0131n hala makul seviyelerde oldu\u011fu fark edildi. <code>pg_stat_activity<\/code> tablosu kontrol edildi\u011finde, y\u00fczlerce ba\u011flant\u0131n\u0131n <code>waiting<\/code> (bekleyen) durumunda oldu\u011fu g\u00f6r\u00fcld\u00fc.<\/p>\n<p>Bu belirtiler, ba\u011flant\u0131 havuzu boyutunun yetersiz oldu\u011funa ve veritaban\u0131 sunucusunun gelen t\u00fcm istekleri kar\u015f\u0131lamak i\u00e7in yeterli e\u015fzamanl\u0131 ba\u011flant\u0131ya sahip olmad\u0131\u011f\u0131na i\u015faret ediyordu. Uygulama, ba\u011flant\u0131 beklerken zaman a\u015f\u0131m\u0131na u\u011fruyor veya yava\u015f \u00e7al\u0131\u015f\u0131yordu.<\/p>\n<h3>k6 ile Test S\u00fcreci: Optimal Boyutu Aray\u0131\u015f<\/h3>\n<p>Pazaristan ekibi, bu darbo\u011faz\u0131 gidermek i\u00e7in k6'y\u0131 kullanarak sistematik bir y\u00fck testi s\u00fcreci ba\u015flatt\u0131. Ama\u00e7lar\u0131, en d\u00fc\u015f\u00fck latency ve hata oran\u0131yla birlikte, veritaban\u0131 kaynaklar\u0131n\u0131 en verimli \u015fekilde kullanan <strong>PostgreSQL ba\u011flant\u0131 havuzu<\/strong> boyutunu bulmakt\u0131.<\/p>\n<h4>Test Senaryosu:<\/h4>\n<p>K6 test beti\u011fi, ger\u00e7ek kullan\u0131c\u0131 davran\u0131\u015flar\u0131n\u0131 taklit etmek \u00fczere tasarland\u0131: \u00fcr\u00fcn listeleme (<code>\/products<\/code>), \u00fcr\u00fcn detay\u0131 g\u00f6r\u00fcnt\u00fcleme (<code>\/product\/:id<\/code>) ve sepetine ekleme (<code>\/cart\/add<\/code>) gibi en s\u0131k kullan\u0131lan API rotalar\u0131n\u0131 hedefliyordu. Testler, kademeli olarak artan sanal kullan\u0131c\u0131 (VU) say\u0131s\u0131 ile \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131 (\u00f6rne\u011fin, 50 VU'dan ba\u015flayarak 500 VU'ya kadar). Her test 5 dakika s\u00fcrd\u00fc.<\/p>\n<pre><code>\n\/\/ k6 test senaryosunun basitle\u015ftirilmi\u015f hali\nimport http from 'k6\/http';\nimport { group, check, sleep } from 'k6';\n\nexport const options = {\n    stages: [\n        { duration: '1m', target: 50 },  \/\/ 1 dakika boyunca 50 VU\n        { duration: '3m', target: 200 }, \/\/ 3 dakika boyunca 200 VU\n        { duration: '1m', target: 0 },   \/\/ Yava\u015f\u00e7a d\u00fc\u015f\u00fcr\n    ],\n    thresholds: {\n        'http_req_duration{scenario:products}': ['p(95)<300'],\n        'http_req_duration{scenario:product_details}': ['p(95)<200'],\n        'http_req_duration{scenario:cart_add}': ['p(95)<500'],\n        'errors': ['rate<0.01'],\n    },\n};\n\nexport default function () {\n    group('Ana Sayfa ve \u00dcr\u00fcn Listesi', function () {\n        let res = http.get('http:\/\/pazaristan.com\/api\/products', { tags: { scenario: 'products' } });\n        check(res, { 'status is 200': (r) => r.status === 200 });\n        sleep(Math.random() * 2 + 1); \/\/ 1-3 saniye bekle\n    });\n\n    group('\u00dcr\u00fcn Detay Sayfas\u0131', function () {\n        let productId = Math.floor(Math.random() * 1000) + 1; \/\/ Rastgele \u00fcr\u00fcn ID\n        let res = http.get(<code>http:\/\/pazaristan.com\/api\/product\/${productId}<\/code>, { tags: { scenario: 'product_details' } });\n        check(res, { 'status is 200': (r) => r.status === 200 });\n        sleep(Math.random() * 1 + 0.5); \/\/ 0.5-1.5 saniye bekle\n    });\n\n    group('Sepete Ekleme', function () {\n        let productId = Math.floor(Math.random() * 1000) + 1;\n        let res = http.post(\n            'http:\/\/pazaristan.com\/api\/cart\/add',\n            JSON.stringify({ productId: productId, quantity: 1 }),\n            {\n                headers: { 'Content-Type': 'application\/json' },\n                tags: { scenario: 'cart_add' },\n            }\n        );\n        check(res, { 'status is 200\/201': (r) => r.status === 200 || r.status === 201 });\n        sleep(Math.random() * 0.5 + 0.2); \/\/ 0.2-0.7 saniye bekle\n    });\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Denemeler ve Bulgular:<\/h4>\n<p>Ekip, <strong>Node.js uygulamas\u0131n\u0131n ba\u011flant\u0131 havuzu boyutunu<\/strong> a\u015fa\u011f\u0131daki gibi farkl\u0131 de\u011ferlerde test etti:<\/p>\n<ul>\n<li><strong>max: 10 (Mevcut Durum):<\/strong>\n<ul>\n<li>k6 Sonu\u00e7lar\u0131: <code>p(95) http_req_duration<\/code> 1800ms, <code>errors<\/code> %12.<\/li>\n<li>PostgreSQL Metrikleri: CPU %90+, 500+ <code>waiting<\/code> ba\u011flant\u0131, <code>idle in transaction<\/code> say\u0131s\u0131 y\u00fcksek.<\/li>\n<li>Yorum: A\u011f\u0131r darbo\u011faz, yetersiz ba\u011flant\u0131 havuzu.<\/li>\n<\/ul>\n<\/li>\n<li><strong>max: 20:<\/strong>\n<ul>\n<li>k6 Sonu\u00e7lar\u0131: <code>p(95) http_req_duration<\/code> 750ms, <code>errors<\/code> %3.<\/li>\n<li>PostgreSQL Metrikleri: CPU %85, 150 <code>waiting<\/code> ba\u011flant\u0131.<\/li>\n<li>Yorum: K\u0131smi iyile\u015fme, ancak hala ba\u011flant\u0131 beklemeleri mevcut.<\/li>\n<\/ul>\n<\/li>\n<li><strong>max: 50:<\/strong>\n<ul>\n<li>k6 Sonu\u00e7lar\u0131: <code>p(95) http_req_duration<\/code> 280ms, <code>errors<\/code> %0.5.<\/li>\n<li>PostgreSQL Metrikleri: CPU %70, 10-20 <code>waiting<\/code> ba\u011flant\u0131 (k\u0131sa s\u00fcreli).<\/li>\n<li>Yorum: \u00d6nemli iyile\u015fme, neredeyse kabul edilebilir seviyede.<\/li>\n<\/ul>\n<\/li>\n<li><strong>max: 80:<\/strong>\n<ul>\n<li>k6 Sonu\u00e7lar\u0131: <code>p(95) http_req_duration<\/code> 250ms, <code>errors<\/code> %0.<\/li>\n<li>PostgreSQL Metrikleri: CPU %65, 0-5 <code>waiting<\/code> ba\u011flant\u0131. Bellek kullan\u0131m\u0131 %5 artt\u0131.<\/li>\n<li>Yorum: En iyi latency de\u011ferleri, hata yok. Kaynak kullan\u0131m\u0131 makul.<\/li>\n<\/ul>\n<\/li>\n<li><strong>max: 120:<\/strong>\n<ul>\n<li>k6 Sonu\u00e7lar\u0131: <code>p(95) http_req_duration<\/code> 270ms, <code>errors<\/code> %0.<\/li>\n<li>PostgreSQL Metrikleri: CPU %80, 0 <code>waiting<\/code> ba\u011flant\u0131, ancak 50+ <code>idle<\/code> ba\u011flant\u0131. Bellek kullan\u0131m\u0131 %15 artt\u0131.<\/li>\n<li>Yorum: Yan\u0131t s\u00fcresi artmad\u0131, hatta biraz y\u00fckseldi. CPU kullan\u0131m\u0131 gereksiz yere y\u00fckseldi, \u00e7ok fazla bo\u015fta bekleyen ba\u011flant\u0131 kaynaklar\u0131 t\u00fcketiyor.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Sonu\u00e7 ve \u00c7\u00f6z\u00fcm:<\/h3>\n<p>Yap\u0131lan testler sonucunda Pazaristan ekibi, <strong>optimal PostgreSQL ba\u011flant\u0131 havuzu boyutunun 80 oldu\u011funu<\/strong> belirledi. Bu boyutta, uygulama en d\u00fc\u015f\u00fck yan\u0131t s\u00fcrelerine ve s\u0131f\u0131r hata oran\u0131na ula\u015f\u0131rken, PostgreSQL sunucusu CPU ve bellek kaynaklar\u0131n\u0131 en verimli \u015fekilde kullan\u0131yordu. <code>max: 120<\/code> gibi daha y\u00fcksek bir de\u011fere \u00e7\u0131kmak, performans art\u0131\u015f\u0131 sa\u011flamad\u0131\u011f\u0131 gibi gereksiz kaynak t\u00fcketimine neden oluyordu.<\/p>\n<p>Ba\u011flant\u0131 havuzu boyutunu 10'dan 80'e \u00e7\u0131karmak, uygulaman\u0131n <code>p(95)<\/code> yan\u0131t s\u00fcresini %85'in \u00fczerinde iyile\u015ftirdi ve hata oranlar\u0131n\u0131 tamamen ortadan kald\u0131rd\u0131. Bu, Pazaristan'\u0131n yo\u011fun kampanya d\u00f6nemlerinde bile sorunsuz bir kullan\u0131c\u0131 deneyimi sunmas\u0131n\u0131 sa\u011flad\u0131. Ayr\u0131ca, veritaban\u0131 kilitlenme sorunlar\u0131 da \u00f6nemli \u00f6l\u00e7\u00fcde azald\u0131. Bu vaka analizi, sistematik y\u00fck testlerinin ve veri analizi yetene\u011finin, karma\u015f\u0131k sistemlerdeki performans darbo\u011fazlar\u0131n\u0131 nas\u0131l ba\u015far\u0131yla \u00e7\u00f6zebilece\u011fimizi a\u00e7\u0131k\u00e7a g\u00f6stermektedir.<\/p>\n<h2>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar: Performans\u0131 Daha da Art\u0131rmak<\/h2>\n<p>Optimal <strong>PostgreSQL ba\u011flant\u0131 havuzu<\/strong> boyutunu bulmak harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r, ancak performans optimizasyonu dinamik bir s\u00fcre\u00e7tir. Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, kullan\u0131c\u0131 taban\u0131n\u0131z geni\u015fledik\u00e7e ve i\u015f y\u00fck\u00fcn\u00fcz de\u011fi\u015ftik\u00e7e, ek optimizasyonlara ihtiya\u00e7 duyabilirsiniz. Bu b\u00f6l\u00fcmde, deneyimli geli\u015ftiriciler ve sistem y\u00f6neticileri i\u00e7in, ba\u011flant\u0131 havuzu y\u00f6netimini daha da iyile\u015ftirecek ve genel sistem performans\u0131n\u0131 art\u0131racak ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalar\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>Ba\u011flant\u0131 Havuzu Algoritmas\u0131 ve Yap\u0131land\u0131rma \u0130ncelemesi<\/h3>\n<p>Kulland\u0131\u011f\u0131n\u0131z ba\u011flant\u0131 havuzu k\u00fct\u00fcphanesinin (\u00f6rne\u011fin HikariCP, Pg-pool, SQLAlchemy) yap\u0131land\u0131rma se\u00e7eneklerini derinlemesine inceleyin. Sadece <code>max<\/code> boyutunu de\u011fil, ayn\u0131 zamanda a\u015fa\u011f\u0131daki parametreleri de g\u00f6z \u00f6n\u00fcnde bulundurun:<\/p>\n<ul>\n<li><strong><code>idleTimeoutMillis<\/code> \/ <code>maxIdleTime<\/code>:<\/strong> Bo\u015fta duran bir ba\u011flant\u0131n\u0131n havuzdan kald\u0131r\u0131lmadan \u00f6nce ne kadar s\u00fcre bekleyece\u011fini belirler. \u00c7ok uzun s\u00fcreler, gereksiz kaynak t\u00fcketimine neden olurken, \u00e7ok k\u0131sa s\u00fcreler ba\u011flant\u0131lar\u0131n s\u0131k s\u0131k kapat\u0131l\u0131p a\u00e7\u0131lmas\u0131na yol a\u00e7abilir. Genellikle birka\u00e7 dakikal\u0131k bir s\u00fcre idealdir.<\/li>\n<li><strong><code>connectionTimeoutMillis<\/code>:<\/strong> Bir uygulaman\u0131n havuzdan ba\u011flant\u0131 beklerken ne kadar s\u00fcre bekleyece\u011fini belirler. Bu s\u00fcre a\u015f\u0131ld\u0131\u011f\u0131nda bir hata f\u0131rlat\u0131l\u0131r. Bu, uygulaman\u0131z\u0131n sonsuza kadar donmas\u0131n\u0131 engeller, ancak kullan\u0131c\u0131ya \"hizmet kullan\u0131lam\u0131yor\" gibi bir hata mesaj\u0131 d\u00f6nmesine neden olabilir.<\/li>\n<li><strong><code>validationQuery<\/code> \/ <code>connectionTestQuery<\/code>:<\/strong> Bir ba\u011flant\u0131n\u0131n havuza iade edilmeden veya havuzdan al\u0131nmadan \u00f6nce hala ge\u00e7erli olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in kullan\u0131lan basit bir sorgudur (\u00f6rne\u011fin <code>SELECT 1<\/code>). Bu, kopmu\u015f ba\u011flant\u0131lar\u0131n kullan\u0131lmas\u0131n\u0131 engeller ancak her ba\u011flant\u0131 al\u0131m\u0131nda k\u00fc\u00e7\u00fck bir ek maliyet getirir.<\/li>\n<li><strong>LIFO (Last-In-First-Out) vs. FIFO (First-In-First-Out):<\/strong> Baz\u0131 havuzlar, ba\u011flant\u0131lar\u0131 havuza geri verirken LIFO (son giren ilk \u00e7\u0131kar) veya FIFO (ilk giren ilk \u00e7\u0131kar) algoritmalar\u0131n\u0131 kullanabilir. LIFO, genellikle daha \"s\u0131cak\" olan, yani daha yeni kullan\u0131lan ba\u011flant\u0131lar\u0131 tekrar kullanarak \u00f6nbellek isabet oranlar\u0131n\u0131 art\u0131rabilir.<\/li>\n<\/ul>\n<h3>Proxy Kullan\u0131m\u0131: PgBouncer veya Odyssey<\/h3>\n<p>E\u011fer uygulaman\u0131z \u00e7ok hizmetli (microservices) bir mimariye sahipse veya ayn\u0131 PostgreSQL veritaban\u0131na ba\u011flanan birden fazla uygulaman\u0131z varsa, <strong>PgBouncer<\/strong> veya <strong>Odyssey<\/strong> gibi bir ba\u011flant\u0131 havuzu proxy'si kullanmay\u0131 ciddi \u015fekilde d\u00fc\u015f\u00fcnmelisiniz. Bu ara\u00e7lar, uygulama katman\u0131ndan ayr\u0131 bir katmanda \u00e7al\u0131\u015f\u0131r ve \u015fu avantajlar\u0131 sunar:<\/p>\n<ul>\n<li><strong>Merkezi Ba\u011flant\u0131 Havuzu:<\/strong> T\u00fcm uygulamalar tek bir proxy'ye ba\u011flan\u0131r, proxy ise veritaban\u0131na s\u0131n\u0131rl\u0131 say\u0131da ba\u011flant\u0131 a\u00e7ar. Bu, veritaban\u0131 \u00fczerindeki ba\u011flant\u0131 y\u00fck\u00fcn\u00fc dramatik \u015fekilde azalt\u0131r.<\/li>\n<li><strong>Hafif ve H\u0131zl\u0131:<\/strong> \u00d6zel olarak ba\u011flant\u0131 y\u00f6netimi i\u00e7in optimize edilmi\u015flerdir.<\/li>\n<li><strong>Ba\u011flant\u0131 Modlar\u0131:<\/strong> Hem i\u015flem (transaction) bazl\u0131 hem de oturum (session) bazl\u0131 ba\u011flant\u0131 modlar\u0131n\u0131 desteklerler. \u0130\u015flem bazl\u0131 mod (<code>transaction pooling<\/code>), bir ba\u011flant\u0131y\u0131 yaln\u0131zca bir i\u015flem s\u00fcresince tutar, bu da veritaban\u0131 taraf\u0131nda \u00e7ok daha az ba\u011flant\u0131 ihtiyac\u0131 yarat\u0131r.<\/li>\n<li><strong>Veritaban\u0131 Kimlik Bilgilerini Gizleme:<\/strong> Uygulama, veritaban\u0131 kimlik bilgilerini do\u011frudan bilmek zorunda kalmaz, bu da g\u00fcvenlik avantajlar\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p>PgBouncer'\u0131 devreye ald\u0131\u011f\u0131n\u0131zda, uygulaman\u0131z PgBouncer'a ba\u011flan\u0131r ve PgBouncer, kendi i\u00e7indeki ba\u011flant\u0131 havuzunu kullanarak PostgreSQL'e ba\u011flan\u0131r. Bu durumda, PgBouncer'\u0131n havuz boyutunu ve uygulaman\u0131z\u0131n PgBouncer'a olan ba\u011flant\u0131 havuzu boyutunu ayr\u0131 ayr\u0131 optimize etmeniz gerekir.<\/p>\n<h3>Sorgu Optimizasyonu ve \u0130ndeksleme<\/h3>\n<p>Ba\u011flant\u0131 havuzu boyutu ne kadar iyi optimize edilmi\u015f olursa olsun, yava\u015f ve verimsiz sorgular genel performans\u0131 her zaman d\u00fc\u015f\u00fcrecektir. D\u00fczenli olarak <code>pg_stat_statements<\/code> ve <code>EXPLAIN ANALYZE<\/code> kullanarak en yava\u015f sorgular\u0131n\u0131z\u0131 belirleyin ve onlar\u0131 optimize edin:<\/p>\n<ul>\n<li>Gerekli tablolara do\u011fru indeksleri ekleyin.<\/li>\n<li>Karma\u015f\u0131k sorgular\u0131 daha basit par\u00e7alara ay\u0131r\u0131n veya materialized view'lar kullan\u0131n.<\/li>\n<li>Gereksiz <code>JOIN<\/code>'lerden ka\u00e7\u0131n\u0131n.<\/li>\n<li><code>SELECT *<\/code> yerine sadece ihtiyac\u0131n\u0131z olan s\u00fctunlar\u0131 se\u00e7in.<\/li>\n<\/ul>\n<h3>Load Balancing ve Yatay \u00d6l\u00e7eklendirme<\/h3>\n<p>E\u011fer tek bir PostgreSQL sunucusu art\u0131k talebi kar\u015f\u0131layam\u0131yorsa, load balancing (y\u00fck dengeleme) ve yatay \u00f6l\u00e7eklendirme se\u00e7eneklerini de\u011ferlendirin:<\/p>\n<ul>\n<li><strong>Read Replicas (Okuma Kopyalar\u0131):<\/strong> Yo\u011fun okuma i\u015flemlerine sahip uygulamalar i\u00e7in okuma replikalar\u0131 olu\u015fturarak okuma y\u00fck\u00fcn\u00fc da\u011f\u0131tabilirsiniz. Uygulaman\u0131z\u0131n okuma sorgular\u0131n\u0131 replikalara y\u00f6nlendirirken, yazma sorgular\u0131n\u0131 ana veritaban\u0131na g\u00f6ndermesini sa\u011flay\u0131n.<\/li>\n<li><strong>Veritaban\u0131 \u015eardlama (Sharding):<\/strong> E\u011fer veritaban\u0131n\u0131z \u00e7ok b\u00fcy\u00fckse ve tek bir sunucuda bar\u0131nd\u0131r\u0131lam\u0131yorsa, verileri birden fazla sunucuya da\u011f\u0131tmak i\u00e7in \u015fardlama stratejilerini inceleyin. Ancak bu, karma\u015f\u0131k bir \u00e7\u00f6z\u00fcmd\u00fcr ve uygulaman\u0131z\u0131n mimarisinde ciddi de\u011fi\u015fiklikler gerektirebilir.<\/li>\n<\/ul>\n<h3>S\u00fcrekli \u0130zleme ve Alarm Kurulumu<\/h3>\n<p>Performans optimizasyonu tek seferlik bir i\u015f de\u011fildir. Uygulaman\u0131z\u0131n ve veritaban\u0131n\u0131z\u0131n performans\u0131n\u0131 s\u00fcrekli olarak izlemek kritik \u00f6neme sahiptir. Prometheus, Grafana, Datadog gibi ara\u00e7lar\u0131 kullanarak:<\/p>\n<ul>\n<li>Ba\u011flant\u0131 havuzu metriklerini (kullan\u0131lan, bo\u015fta bekleyen, bekleyen ba\u011flant\u0131 say\u0131s\u0131).<\/li>\n<li>Veritaban\u0131 metriklerini (CPU, RAM, disk I\/O, aktif\/bo\u015fta ba\u011flant\u0131lar, kilitlenmeler).<\/li>\n<li>Uygulama metriklerini (API yan\u0131t s\u00fcreleri, hata oranlar\u0131).<\/li>\n<\/ul>\n<p>izleyin. Belirledi\u011finiz e\u015fik de\u011ferlerini a\u015fan durumlarda otomatik uyar\u0131lar alacak \u015fekilde sisteminizi yap\u0131land\u0131r\u0131n. Bu sayede, herhangi bir performans d\u00fc\u015f\u00fc\u015f\u00fc ya\u015fanmadan \u00f6nce sorunlar\u0131 proaktif olarak tespit edebilir ve m\u00fcdahale edebilirsiniz. \u00d6rne\u011fin, ba\u011flant\u0131 havuzunuzun s\u00fcrekli maksimum kapasitede \u00e7al\u0131\u015fmas\u0131 veya \u00e7ok say\u0131da ba\u011flant\u0131n\u0131n bekleme durumunda olmas\u0131, havuz boyutunun yeniden ayarlanmas\u0131 gerekti\u011finin bir g\u00f6stergesi olabilir.<\/p>\n<div class=\"expert-tip\">\n    Uzman \u0130pucu: Ba\u011flant\u0131 havuzu boyutunu belirlerken, her bir ba\u011flant\u0131n\u0131n veritaban\u0131 sunucusunda t\u00fcketece\u011fi bellek miktar\u0131n\u0131 (<code>work_mem<\/code>, <code>maintenance_work_mem<\/code> gibi parametreler dikkate al\u0131narak) g\u00f6z \u00f6n\u00fcnde bulundurun. A\u015f\u0131r\u0131 b\u00fcy\u00fck havuzlar, gereksiz bellek t\u00fcketimiyle sunucuyu yava\u015flatabilir.\n<\/div>\n<p>Bu ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalar, uygulaman\u0131z\u0131n <strong>PostgreSQL ba\u011flant\u0131 havuzu<\/strong> y\u00f6netimini daha da g\u00fc\u00e7lendirecek ve y\u00fcksek performansl\u0131, \u00f6l\u00e7eklenebilir bir sistem olu\u015fturman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Performans yolculu\u011funuzda s\u00fcrekli \u00f6\u011frenmeye ve iyile\u015ftirmeye a\u00e7\u0131k olun.<\/p>\n<h2>Sonu\u00e7: Uygulaman\u0131z \u0130\u00e7in M\u00fckemmel Dengeyi Buldunuz mu?<\/h2>\n<p>Bu makale boyunca, modern uygulamalar\u0131n en kritik performans darbo\u011fazlar\u0131ndan biri olan PostgreSQL ba\u011flant\u0131 havuzu optimizasyonunu derinlemesine inceledik. Ba\u015flang\u0131\u00e7ta neden do\u011fru ba\u011flant\u0131 havuzu boyutunun bu kadar \u00f6nemli oldu\u011funu a\u00e7\u0131klayarak dikkatleri \u00e7ektik. Ard\u0131ndan, PostgreSQL ba\u011flant\u0131 havuzlar\u0131n\u0131n temel prensiplerini ve k6 y\u00fck test arac\u0131n\u0131n sa\u011flad\u0131\u011f\u0131 g\u00fc\u00e7l\u00fc yetenekleri ke\u015ffettik. Ad\u0131m ad\u0131m, k6 ve bir \u00f6rnek Node.js uygulamas\u0131 kullanarak nas\u0131l test ortam\u0131 kurulaca\u011f\u0131n\u0131, farkl\u0131 havuz boyutlar\u0131n\u0131n nas\u0131l denenece\u011fini ve elde edilen performans metriklerinin nas\u0131l yorumlanaca\u011f\u0131n\u0131 \u00f6\u011frendik. Pazaristan e-ticaret uygulamas\u0131 vaka analizi, teorik bilgilerin ger\u00e7ek bir senaryoda nas\u0131l somut sonu\u00e7lara d\u00f6n\u00fc\u015ft\u00fc\u011f\u00fcn\u00fc g\u00f6sterdi. Son olarak, PgBouncer gibi proxy'lerden sorgu optimizasyonuna kadar uzanan ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalarla, s\u00fcrekli iyile\u015ftirmenin yollar\u0131n\u0131 ele ald\u0131k.<\/p>\n<p>Unutmay\u0131n ki <strong>optimal PostgreSQL ba\u011flant\u0131 havuzu<\/strong> boyutu, her uygulama ve her i\u015f y\u00fck\u00fc i\u00e7in farkl\u0131l\u0131k g\u00f6sterir. Bu, statik bir de\u011ferden ziyade dinamik bir hedef olmal\u0131d\u0131r. Uygulaman\u0131z\u0131n trafi\u011fi, veritaban\u0131 sorgular\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131 ve veritaban\u0131 sunucunuzun kaynaklar\u0131 gibi bir\u00e7ok fakt\u00f6r bu boyutu etkiler. Bu nedenle, d\u00fczenli aral\u0131klarla y\u00fck testleri yapmak, performans\u0131 izlemek ve gerekti\u011finde ba\u011flant\u0131 havuzu yap\u0131land\u0131rmas\u0131n\u0131 yeniden ayarlamak kritik \u00f6neme sahiptir. k6 gibi esnek ve geli\u015ftirici dostu bir ara\u00e7, bu s\u00fcrekli optimizasyon s\u00fcrecini \u00e7ok daha y\u00f6netilebilir hale getirir.<\/p>\n<p>Bu rehber, uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131rma yolculu\u011funuzda size sa\u011flam bir temel sunmay\u0131 ama\u00e7lam\u0131\u015ft\u0131r. Art\u0131k, PostgreSQL ba\u011flant\u0131 havuzunuz i\u00e7in m\u00fckemmel dengeyi bulmak ve uygulaman\u0131z\u0131n tam potansiyelini ortaya \u00e7\u0131karmak i\u00e7in gerekli bilgi ve ara\u00e7lara sahipsiniz. Bu bilgileri kullanarak, kullan\u0131c\u0131lar\u0131n\u0131za daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha verimli bir deneyim sunabilirsiniz. Performans optimizasyonu bir var\u0131\u015f noktas\u0131 de\u011fil, s\u00fcrekli bir yolculuktur; bu yolculukta ba\u015far\u0131lar dileriz!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>1. Ba\u011flant\u0131 havuzu boyutu sadece veritaban\u0131 ba\u011flant\u0131lar\u0131na m\u0131 bakar?<\/h4>\n<p>Hay\u0131r, ba\u011flant\u0131 havuzu boyutu do\u011frudan veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 y\u00f6netse de, dolayl\u0131 olarak uygulaman\u0131n t\u00fcm katmanlar\u0131n\u0131 etkiler. Yetersiz havuz boyutu, uygulaman\u0131n yava\u015flamas\u0131na, sunucu kaynaklar\u0131n\u0131n (CPU, bellek) verimsiz kullan\u0131lmas\u0131na ve kullan\u0131c\u0131 deneyiminin k\u00f6t\u00fcle\u015fmesine yol a\u00e7ar. Optimal bir boyut, sadece veritaban\u0131 taraf\u0131nda de\u011fil, uygulaman\u0131n genel yan\u0131t s\u00fcresinde ve hata oranlar\u0131nda da iyile\u015fme sa\u011flar.<\/p>\n<h4>2. k6 yerine ba\u015fka bir y\u00fck testi arac\u0131 kullanabilir miyim?<\/h4>\n<p>Evet, elbette. Apache JMeter, Locust, Gatling gibi bir\u00e7ok pop\u00fcler y\u00fck testi arac\u0131 mevcuttur. Ancak k6, JavaScript tabanl\u0131 olmas\u0131, modern geli\u015ftirme s\u00fcre\u00e7lerine kolay entegrasyonu ve y\u00fcksek performans\u0131yla \u00f6ne \u00e7\u0131kar. Hangi arac\u0131 se\u00e7erseniz se\u00e7in, temel prensipler (farkl\u0131 y\u00fckler alt\u0131nda test etme, metrikleri izleme ve analiz etme) benzer kalacakt\u0131r.<\/p>\n<h4>3. Optimal boyut her zaman sabit midir?<\/h4>\n<p>Hay\u0131r, optimal ba\u011flant\u0131 havuzu boyutu statik de\u011fildir. Uygulaman\u0131z\u0131n i\u015f y\u00fck\u00fc (kullan\u0131c\u0131 say\u0131s\u0131, sorgu t\u00fcrleri), veritaban\u0131 sunucunuzun donan\u0131m\u0131, a\u011f gecikmesi ve hatta veritaban\u0131 \u015feman\u0131zdaki de\u011fi\u015fiklikler gibi bir\u00e7ok fakt\u00f6re ba\u011fl\u0131 olarak zamanla de\u011fi\u015febilir. Bu nedenle, periyodik olarak y\u00fck testleri yapmak ve performans\u0131 izlemek \u00f6nemlidir.<\/p>\n<h4>4. PgBouncer kullanmak ne zaman gerekli olur?<\/h4>\n<p>PgBouncer veya benzeri bir ba\u011flant\u0131 havuzu proxy'si kullanmak, \u00f6zellikle a\u015fa\u011f\u0131daki durumlarda \u015fiddetle tavsiye edilir:<\/p>\n<ul>\n<li>Ayn\u0131 PostgreSQL veritaban\u0131na ba\u011flanan birden fazla uygulaman\u0131z veya mikroservisiniz varsa.<\/li>\n<li>Uygulaman\u0131z \u00e7ok say\u0131da k\u0131sa s\u00fcreli ba\u011flant\u0131 a\u00e7\u0131p kapat\u0131yorsa.<\/li>\n<li>Veritaban\u0131 sunucusunun maksimum ba\u011flant\u0131 limitine s\u0131k s\u0131k ula\u015f\u0131yorsan\u0131z.<\/li>\n<li>Ba\u011flant\u0131 a\u00e7ma\/kapama gecikmelerini minimize etmek istiyorsan\u0131z.<\/li>\n<\/ul>\n<p>PgBouncer, veritaban\u0131 \u00fczerindeki y\u00fck\u00fc azalt\u0131r ve ba\u011flant\u0131 y\u00f6netimini merkezile\u015ftirir.<\/p>\n<h4>5. Ba\u011flant\u0131 havuzu \u00e7ok b\u00fcy\u00fck olursa ne olur?<\/h4>\n<p>Ba\u011flant\u0131 havuzu boyutunun gere\u011finden fazla b\u00fcy\u00fck olmas\u0131, a\u015fa\u011f\u0131daki sorunlara yol a\u00e7abilir:<\/p>\n<ul>\n<li><strong>Gereksiz Bellek T\u00fcketimi:<\/strong> Her ba\u011flant\u0131, veritaban\u0131 sunucusunda belirli bir miktar bellek t\u00fcketir. \u00c7ok fazla bo\u015fta bekleyen ba\u011flant\u0131, sunucunun belle\u011fini gereksiz yere kullan\u0131r ve di\u011fer i\u015flemler i\u00e7in bellek kalmayabilir.<\/li>\n<li><strong>CPU Y\u00fck\u00fc:<\/strong> Veritaban\u0131, bo\u015fta olsa bile bu ba\u011flant\u0131lar\u0131 y\u00f6netmek i\u00e7in CPU kaynaklar\u0131 harcar (\u00f6rne\u011fin, ba\u011flam de\u011fi\u015ftirme - context switching).<\/li>\n<li><strong>Kilitlenme ve \u00c7eki\u015fme:<\/strong> \u00c7ok say\u0131da e\u015fzamanl\u0131 ba\u011flant\u0131, veritaban\u0131ndaki kaynaklar \u00fczerinde kilitlenme (locking) ve \u00e7eki\u015fme (contention) olas\u0131l\u0131\u011f\u0131n\u0131 art\u0131rarak performans\u0131 d\u00fc\u015f\u00fcrebilir.<\/li>\n<li><strong>Veritaban\u0131 Limitleri:<\/strong> PostgreSQL'in <code>max_connections<\/code> limiti vard\u0131r. Bu limitin a\u015f\u0131lmas\u0131, yeni ba\u011flant\u0131lar\u0131n reddedilmesine neden olur.<\/li>\n<\/ul>\n<p>Optimal boyut, performans\u0131 maksimize ederken kaynak t\u00fcketimini minimumda tutan dengedir.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Uygulama performans\u0131n\u0131z\u0131 PostgreSQL ile maksimize etmek mi istiyorsunuz? k6 y\u00fck testi ile optimal ba\u011flant\u0131 havuzu boyutunu nas\u0131l bulaca\u011f\u0131n\u0131z\u0131&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[644],"tags":[],"class_list":{"0":"post-33932","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-postgresql","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PostgreSQL Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Optimize Etme Rehberi<\/title>\n<meta name=\"description\" content=\"Uygulama performans\u0131n\u0131z\u0131 PostgreSQL ile maksimize etmek mi istiyorsunuz? k6 y\u00fck testi ile optimal ba\u011flant\u0131 havuzu boyutunu nas\u0131l bulaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. Sunucu kaynaklar\u0131n\u0131 verimli kullan\u0131n ve darbo\u011fazlar\u0131 ortadan kald\u0131r\u0131n. Bu rehber, uygulaman\u0131z\u0131n ger\u00e7ek potansiyelini ortaya \u00e7\u0131karmak i\u00e7in ihtiyac\u0131n\u0131z olan t\u00fcm bilgileri sunuyor.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Optimize Etme Rehberi\" \/>\n<meta property=\"og:description\" content=\"Uygulama performans\u0131n\u0131z\u0131 PostgreSQL ile maksimize etmek mi istiyorsunuz? k6 y\u00fck testi ile optimal ba\u011flant\u0131 havuzu boyutunu nas\u0131l bulaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. Sunucu kaynaklar\u0131n\u0131 verimli kullan\u0131n ve darbo\u011fazlar\u0131 ortadan kald\u0131r\u0131n. Bu rehber, uygulaman\u0131z\u0131n ger\u00e7ek potansiyelini ortaya \u00e7\u0131karmak i\u00e7in ihtiyac\u0131n\u0131z olan t\u00fcm bilgileri sunuyor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-08T22:01:31+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"PostgreSQL Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Optimize Etme Rehberi\",\"datePublished\":\"2025-11-08T22:01:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/\"},\"wordCount\":6642,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PostgreSQL\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/\",\"name\":\"PostgreSQL Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Optimize Etme Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-08T22:01:31+00:00\",\"description\":\"Uygulama performans\u0131n\u0131z\u0131 PostgreSQL ile maksimize etmek mi istiyorsunuz? k6 y\u00fck testi ile optimal ba\u011flant\u0131 havuzu boyutunu nas\u0131l bulaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. Sunucu kaynaklar\u0131n\u0131 verimli kullan\u0131n ve darbo\u011fazlar\u0131 ortadan kald\u0131r\u0131n. Bu rehber, uygulaman\u0131z\u0131n ger\u00e7ek potansiyelini ortaya \u00e7\u0131karmak i\u00e7in ihtiyac\u0131n\u0131z olan t\u00fcm bilgileri sunuyor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Optimize Etme Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PostgreSQL Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Optimize Etme Rehberi","description":"Uygulama performans\u0131n\u0131z\u0131 PostgreSQL ile maksimize etmek mi istiyorsunuz? k6 y\u00fck testi ile optimal ba\u011flant\u0131 havuzu boyutunu nas\u0131l bulaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. Sunucu kaynaklar\u0131n\u0131 verimli kullan\u0131n ve darbo\u011fazlar\u0131 ortadan kald\u0131r\u0131n. Bu rehber, uygulaman\u0131z\u0131n ger\u00e7ek potansiyelini ortaya \u00e7\u0131karmak i\u00e7in ihtiyac\u0131n\u0131z olan t\u00fcm bilgileri sunuyor.","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:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"PostgreSQL Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Optimize Etme Rehberi","og_description":"Uygulama performans\u0131n\u0131z\u0131 PostgreSQL ile maksimize etmek mi istiyorsunuz? k6 y\u00fck testi ile optimal ba\u011flant\u0131 havuzu boyutunu nas\u0131l bulaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. Sunucu kaynaklar\u0131n\u0131 verimli kullan\u0131n ve darbo\u011fazlar\u0131 ortadan kald\u0131r\u0131n. Bu rehber, uygulaman\u0131z\u0131n ger\u00e7ek potansiyelini ortaya \u00e7\u0131karmak i\u00e7in ihtiyac\u0131n\u0131z olan t\u00fcm bilgileri sunuyor.","og_url":"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-08T22:01:31+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"PostgreSQL Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Optimize Etme Rehberi","datePublished":"2025-11-08T22:01:31+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/"},"wordCount":6642,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PostgreSQL"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/","name":"PostgreSQL Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Optimize Etme Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-08T22:01:31+00:00","description":"Uygulama performans\u0131n\u0131z\u0131 PostgreSQL ile maksimize etmek mi istiyorsunuz? k6 y\u00fck testi ile optimal ba\u011flant\u0131 havuzu boyutunu nas\u0131l bulaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedin. Sunucu kaynaklar\u0131n\u0131 verimli kullan\u0131n ve darbo\u011fazlar\u0131 ortadan kald\u0131r\u0131n. Bu rehber, uygulaman\u0131z\u0131n ger\u00e7ek potansiyelini ortaya \u00e7\u0131karmak i\u00e7in ihtiyac\u0131n\u0131z olan t\u00fcm bilgileri sunuyor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/postgresql-baglanti-havuzu-boyutunu-k6-ile-optimize-etme-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL Ba\u011flant\u0131 Havuzu Boyutunu k6 ile Optimize Etme Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33932","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33932"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33932\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33932"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33932"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33932"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}