Windows进程CPU、内存等资源限制

Windows自身没有提供类似Linux cgroup的能力来限制进程或进程组的资源占用,进程CPU/IO/内存/网络等资源的控制只能由自己实现。目前已有第三方的实现,主要是限制进程CPU的占用,如文档 < 21 Best Ways to Limit the CPU Usage of a Process > 所描述的BES,Process Tamer等软件。自Windows 8及Server 2012开始Windows系统有提供以job为单位的CPU占用及内存上限设置,之前的版本则只能以进程或线程为单位进行限制。

进程CPU占用限制方案

即时轮询系统所有进程(线程)的CPU占用,当发现所设定进程有超标时强制暂停进程所有线程的执行,然后在适当的时机再恢复执行。其中所涉及技术点:

进程CPU占用查询 GetProcessTimes

BOOL GetProcessTimes(
  [in]  HANDLE     hProcess,
  [out] LPFILETIME lpCreationTime,
  [out] LPFILETIME lpExitTime,
  [out] LPFILETIME lpKernelTime,
  [out] LPFILETIME lpUserTime
);

此函数可以获取进程从创建至当前的总运行时间及总的CPU时间,(KernelTime + UserTime) < 系统CPU数 * (当前时间 - CreationTime)

线程CPU占用查询 GetThreadTimes

BOOL GetThreadTimes(
  [in]  HANDLE     hThread,
  [out] LPFILETIME lpCreationTime,
  [out] LPFILETIME lpExitTime,
  [out] LPFILETIME lpKernelTime,
  [out] LPFILETIME lpUserTime
);

QueryThreadCycleTime可以提供更精准的CPU时间数据,单位为CPU时钟周期

BOOL QueryThreadCycleTime(
  [in]  HANDLE   ThreadHandle,
  [out] PULONG64 CycleTime
);

线程暂停及恢复

Windows平台没有提供暂停整个进程的支持函数,只能以线程为单位来操作,即SuspendThread及ResumeThread:

DWORD SuspendThread(
  [in] HANDLE hThread
);
DWORD ResumeThread(
  [in] HANDLE hThread
);

CPU亲和性设置: SetProcessAffinityMask

BOOL SetProcessAffinityMask(
  [in] HANDLE    hProcess,
  [in] DWORD_PTR dwProcessAffinityMask
);

此函数可以限定进程及其所有线程所能使用的CPU,故一定程序上亦限定了进程最大的系统CPU占用率。

DWORD_PTR SetThreadAffinityMask(
  [in] HANDLE    hThread,
  [in] DWORD_PTR dwThreadAffinityMask
);

此函数可单独限制特定线程的CPU亲和性。

进程优先级设置: SetPriorityClass

优先级解决的是优先运行及退让CPU的问题,本质上并不能限定CPU占用,只是优先级高于当前任务的忙碌的时候,当前进程会主动退让CPU 线程优先级设置:SetThreadPriority

BOOL SetThreadPriority(
  [in] HANDLE hThread,
  [in] int    nPriority
);

Job Objects

Windows系统提供了Job的概念用以管理多个进程,可以限制Job对象内所有进程及期线程的CPU核心占用、CPU占用及内存分配上限等,均通过SetInformationJobObject来实现,具体的CPU限制由JOBOBJECT_CPU_RATE_CONTROL_INFORMATION管理,内存限制则由JOBOBJECT_EXTENDED_LIMIT_INFORMATION来管理。

BOOL SetInformationJobObject(
  [in] HANDLE             hJob,
  [in] JOBOBJECTINFOCLASS JobObjectInformationClass,
  [in] LPVOID             lpJobObjectInformation,
  [in] DWORD              cbJobObjectInformationLength
);

需要注意的是CPU占用设置只有Windows 8及Server 2012之后的版本有效。

CPU Sets

此部分只限定了CPU Affinity属性

实验验证

可以直接利用开源项目go-winjob验证,验证系统Windows 8 x64,go-winjob git repo: https://github.com/kolesnikovae/go-winjob

验证程序

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

void main(int argc, char *argv[])
{
        unsigned long total = 0, count = 0, i = 0;

        while (1) {
                if (malloc(1024)) {
                        total += 1024;
                        count++;
                }
                if (!(++i &amp; 4095))
                        printf(&quot;alloc: %u size: %u bytes\n&quot;, count, total);
    }
}

无限制

在无限制的情况下,此进程会占满一个CPU核心,commit内存总占用达2G CPUStress unlimited

单一进程

在设定CPU上限16%及内存16M上限之后,结果如下: CPUStress single process examples/job_object.go按如下修改:

var limits = []winjob.Limit{
        winjob.WithBreakawayOK(),
        winjob.WithKillOnJobClose(),
        winjob.WithActiveProcessLimit(3),
        winjob.WithProcessTimeLimit(10 * time.Second),
        winjob.WithCPUHardCapLimit(1600),        // 16%
        winjob.WithProcessMemoryLimit(16 &lt;&lt; 20), // 16MB
        winjob.WithWriteClipboardLimit(),
}

const defaultCommand = &quot;.\\CPUStress.exe&quot;

多进程(双进程)

将winjob.WithProcessMemoryLimit 改为 winjob.WithJobMemoryLimit,后者表示此job内所有进程要占用的总内存限制:

var limits = []winjob.Limit{
        winjob.WithBreakawayOK(),
        winjob.WithKillOnJobClose(),
        winjob.WithActiveProcessLimit(3),
        winjob.WithProcessTimeLimit(10 * time.Second),
        winjob.WithCPUHardCapLimit(1600),    // 16%
        winjob.WithJobMemoryLimit(16 &lt;&lt; 20), // 16MB
        winjob.WithWriteClipboardLimit(),
}

验证结果如下: CPUStress 2-processes CPUStress 2-processes

winjob example代码:

// +build windows

package main

import (
        &quot;encoding/json&quot;
        &quot;log&quot;
        &quot;os&quot;
        &quot;os/exec&quot;
        &quot;os/signal&quot;
        &quot;time&quot;

        &quot;golang.org/x/sys/windows&quot;

        &quot;github.com/kolesnikovae/go-winjob&quot;
)

var limits = []winjob.Limit{
        winjob.WithBreakawayOK(),
        winjob.WithKillOnJobClose(),
        winjob.WithActiveProcessLimit(3),
        winjob.WithProcessTimeLimit(10 * time.Second),
        winjob.WithCPUHardCapLimit(1600),    // 16%
        winjob.WithJobMemoryLimit(16 &lt;&lt; 20), // 16MB
        winjob.WithWriteClipboardLimit(),
}

const defaultCommand = &quot;.\\CPUStress.exe&quot;
const stressCommand  = &quot;.\\CPUStressX64.exe&quot;

func main() {
        job, err := winjob.Create(&quot;&quot;, limits...)
        if err != nil {
                log.Fatalf(&quot;Create: %v&quot;, err)
        }

        cmd := exec.Command(defaultCommand)
        cmd.Stderr = os.Stderr
        cmd.SysProcAttr = &amp;windows.SysProcAttr{
                CreationFlags: windows.CREATE_SUSPENDED,
        }
        if err := cmd.Start(); err != nil {
                log.Fatalf(&quot;Start: %v&quot;, err)
        }

        stress := exec.Command(stressCommand)
        stress.Stderr = os.Stderr
        stress.SysProcAttr = &amp;windows.SysProcAttr{
                CreationFlags: windows.CREATE_SUSPENDED,
        }
        if err := stress.Start(); err != nil {
                log.Fatalf(&quot;Start: %v&quot;, err)
        }

        s := make(chan os.Signal, 1)
        signal.Notify(s, os.Interrupt)

        c := make(chan winjob.Notification)
        subscription, err := winjob.Notify(c, job)
        if err != nil {
                log.Fatalf(&quot;Notify: %v&quot;, err)
        }

        done := make(chan struct{})
        go func() {
                defer close(done)
                ticker := time.NewTicker(time.Second * 5)
                defer ticker.Stop()
                var counters winjob.Counters
                for {
                        select {
                        case &lt;-s:
                                log.Println(&quot;Closing job object&quot;)
                                if err := job.Close(); err != nil {
                                        log.Fatal(err)
                                }
                                log.Println(&quot;Closing subscription&quot;)
                                if err := subscription.Close(); err != nil {
                                        log.Fatal(err)
                                }
                                return

                        case n, ok := &lt;-c:
                                if ok {
                                        log.Printf(&quot;Notification: %#v\n&quot;, n)
                                } else if err := subscription.Err(); err != nil {
                                        log.Fatalf(&quot;Subscription: %v&quot;, err)
                                }

                        case &lt;-ticker.C:
                                if err := job.QueryCounters(&amp;counters); err != nil {
                                        log.Fatalf(&quot;QueryCounters: %v&quot;, err)
                                }
                                b, err := json.MarshalIndent(counters, &quot;&quot;, &quot;\t&quot;)
                                if err != nil {
                                        log.Fatal(err)
                                }
                                log.Printf(&quot;Counters: \n%s\n&quot;, b)
                        }
                }
        }()

        if err := job.Assign(cmd.Process); err != nil {
                log.Fatalf(&quot;Assign: %v&quot;, err)
        }
        if err := winjob.Resume(cmd); err != nil {
                log.Fatalf(&quot;Resume: %v&quot;, err)
        }

        if err := job.Assign(stress.Process); err != nil {
                log.Fatalf(&quot;Assign: %v&quot;, err)
        }
        if err := winjob.Resume(stress); err != nil {
                log.Fatalf(&quot;Resume: %v&quot;, err)
        }

        if err := cmd.Wait(); err != nil {
                log.Fatalf(&quot;Wait: %v&quot;, err)
        }
        if err := stress.Wait(); err != nil {
                log.Fatalf(&quot;Wait: %v&quot;, err)
        }

        // Wait for a signal.
        &lt;-done
}

参考链接

  1. 21 Best Ways to Limit the CPU Usage of a Process
  2. MSDN: Windows Process and Thread Functions
  3. MSDN: CPU Sets
  4. GetThreadTimes

228,239 条评论

  1. Он перестал следить за собой, перестал общаться с нами. Кодирование не помогало, таблетки не работали. стационарное выведение из запоя — это дало нам надежду. И через два месяца мы увидели результат. Мы снова стали семьёй. цены клиник вывода из запоя [url=https://alkogolizm.vyvod-iz-zapoya-v-staczionare-volgograd.ru]https://alkogolizm.vyvod-iz-zapoya-v-staczionare-volgograd.ru[/url] Сохраните, поделитесь, не потеряйте для нашего города. Не ждите, пока станет поздно. Вывод из запоя в стационаре — это реальное решение проблемы!

  2. Когда я понял, что брат умирает — я понял, что нужно срочно действовать. Первый раз, когда я увидел, как он лежит с мутными глазами. Я был в отчаянии, не знал, что делать. Я позвонил, и мне ответили: «Приедем через час». капельница от алкоголя на дому — это спасло моего брата. Убрал интоксикацию, восстановил давление. Анонимно, без учёта, без лишних вопросов. Это реально работает. нарколог на дом анонимно круглосуточно [url=https://narkolog-na-dom-v-kazani.ru]https://narkolog-na-dom-v-kazani.ru[/url] Сохраните, поделитесь, не потеряйте для нашего города. Звоните, помогайте, спасайте. Нарколог на дом — это реальность, и она работает!

  3. Каждый раз всё глубже уходя в зависимость. И не знали, что ещё можно сделать. Врачи пообещали, что это поможет. анонимное кодирование от алкоголя — что вернуло брата к жизни. Он вернулся к работе, к семье, к жизни. Спасибо врачам за их профессионализм и терпение. нарколог на дом кодирование [url=https://zapoy.kodirovanie-ot-alkogolizma-kazan.ru]https://zapoy.kodirovanie-ot-alkogolizma-kazan.ru[/url] Это может спасти жизнь для республики. Если ваш близкий не может справиться с зависимостью — кодирование может стать шансом на новую жизнь. Кодирование от алкоголизма — это реальное решение проблемы!

  4. Когда я понял, что мой брат больше не может справляться сам. Но он срывался снова и снова. Врачи объяснили, как проходит лечение, и мы решились. выезд нарколога на дом — это дало нам шанс начать всё заново. Он вернулся к работе, к семье, к жизни. Это был последний шаг, но он оказался правильным. наркологическая помощь в волгограде [url=https://kapelnica.narkologicheskaya-pomoshh-v-volgograde17.ru]наркологическая помощь в волгограде[/url] Это может спасти жизнь для области. Не ждите, пока станет поздно. Наркологическая помощь — это реальное решение проблемы!

  5. Мой отец пил годами, и мы просто не знали, как ему помочь. Кодирование давало лишь временный эффект. Врачи взялись за отца, и это был наш последний шанс. анонимная наркологическая помощь — что сохранило нашу семью. Был под круглосуточным контролем врачей. Спасибо врачам за их труд и терпение. выведение из запоя на дому люберцы [url=https://narkologicheskaya-klinika-moskva-eip.ru]https://narkologicheskaya-klinika-moskva-eip.ru[/url] По ссылке — подробная информация для нашего города. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологическая клиника — это реальное решение проблемы!

  6. Он пил два дня, а потом просто не мог встать. Я испугалась, что это может быть опасно. Позвонила, объяснила ситуацию, и мне сказали, что врач будет через час. снятие алкогольной интоксикации — это вернуло мужа в нормальное состояние. Через пару часов он уже мог сидеть и пить чай. Анонимно, быстро и без лишних бумаг. купить капельницу от похмелья [url=https://narkolog.kapelnicza-ot-pokhmelya-uzao.ru]купить капельницу от похмелья[/url] По ссылке — подробная информация для Мытищ. Звоните, помогайте, спасайте. Капельница от похмелья — это реальная помощь, которая работает!

  7. И мы просто наблюдали, как он разрушает себя. Мы искали выход, но все методы давали только временный результат. стационарное лечение алкоголизма в Люберцах — это был наш последний шанс, и он сработал. Был под круглосуточным контролем врачей. Он вышел из клиники другим человеком — ясным, спокойным, снова начал улыбаться. реабилитация наркомании в люберцах [url=https://kapelnica.narkologicheskaya-klinika-moskva-eip.ru]реабилитация наркомании в люберцах[/url] Сохраните, поделитесь, не потеряйте для Люберец. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологическая клиника — это реальное решение проблемы!

  8. Когда алкоголь стал его единственным смыслом жизни. Мы перепробовали всё — и капельницы, и уговоры, и даже народные методы. Врачи объяснили, как проходит лечение, и мы решились. круглосуточная наркологическая помощь в Волгограде — это вернуло брата к жизни. Он прошёл курс лечения, и уже несколько месяцев держится. Спасибо врачам за их профессионализм и терпение. нарколог наркологическая помощь [url=https://kapelnica.narkologicheskaya-pomoshh-v-volgograde17.ru]нарколог наркологическая помощь[/url] Сохраните, поделитесь, не потеряйте для юга России. Не ждите, пока станет поздно. Наркологическая помощь — это реальное решение проблемы!

  9. Мы долго не хотели признавать, что мой брат болен. Мы уже перестали верить, что сможем его вытащить. Позвонил, объяснил ситуацию. срочная детоксикация — это дало нам второй шанс. Через пару часов он открыл глаза и улыбнулся. Брат уснул спокойным сном. нарколог на дом вывод из запоя [url=https://narkolog.vyvod-iz-zapoya-na-domu-kazan.ru]нарколог на дом вывод из запоя[/url] Сохраните, поделитесь, не потеряйте для столицы Татарстана. Если ваш близкий в запое — не ждите. Вывод из запоя на дому — это реальность, и она работает!

  10. Когда он увидел, что теряет семью, работу, здоровье. И нашли ту, где врачи не просто ставят укол, а сопровождают пациента. Кодирование от алкоголизма — то, что дало ему шанс начать всё заново. Он прошёл процедуру, и уже полгода держится. Это был последний шаг, но он оказался правильным. кодировка от алкоголя [url=https://alkogolizm.kodirovanie-ot-alkogolizma-kazan.ru]кодировка от алкоголя[/url] Там все контакты и условия для нашего города. Если ваш близкий не может справиться с зависимостью — кодирование может стать шансом на новую жизнь. Кодирование от алкоголизма — это реальное решение проблемы!

  11. Мы долго не хотели признавать, что мой брат болен. Он не ел, не спал, не говорил. Мне ответили: «Приедем через час». срочная детоксикация — это вернуло брата к жизни. Поставил капельницу, ввёл нужные препараты. Анонимно, без учёта, без лишних вопросов. врач на дом выведение из запоя [url=https://narkolog.vyvod-iz-zapoya-na-domu-kazan.ru]врач на дом выведение из запоя[/url] По ссылке — подробная информация для Казани. Каждый час на счету. Вывод из запоя на дому — это реальность, и она работает!

  12. Мы не верили, что мой брат когда-нибудь сможет остановиться. Кодирование не помогало, таблетки не работали. круглосуточная наркологическая помощь — это вернуло брата к жизни. И через два месяца мы увидели результат. Мы снова стали семьёй. лечение запоя в стационаре [url=https://alkogolizm.vyvod-iz-zapoya-v-staczionare-volgograd.ru]https://alkogolizm.vyvod-iz-zapoya-v-staczionare-volgograd.ru[/url] Сохраните, поделитесь, не потеряйте для Волгограда. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Вывод из запоя в стационаре — это реальное решение проблемы!

  13. Когда алкоголь стал его единственным смыслом. Он пил уже несколько лет, и мы просто смирились. Мы начали искать клинику в Люберцах, где работают с зависимостями. анонимная наркологическая помощь — что вернуло брата к жизни. Работал с психологами, посещал групповые занятия. Он вышел из клиники другим человеком — ясным, спокойным, снова начал улыбаться. окситоцин капельница в люберцах [url=https://kodirovanie.narkologicheskaya-klinika-moskva-eip.ru]https://kodirovanie.narkologicheskaya-klinika-moskva-eip.ru[/url] По ссылке — подробная информация для Подмосковья. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологическая клиника — это реальное решение проблемы!

  14. И мы просто наблюдали, как он разрушает себя. И тогда мы решили попробовать стационарное лечение в Люберцах. лечение зависимостей в клинике — это был наш последний шанс, и он сработал. Работал с психологами, посещал групповые занятия. Спасибо врачам за их труд и терпение. вывод из запоя люберцы [url=https://kapelnica.narkologicheskaya-klinika-moskva-eip.ru]https://kapelnica.narkologicheskaya-klinika-moskva-eip.ru[/url] Там все контакты и условия для Подмосковья. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологическая клиника — это реальное решение проблемы!

  15. Мой отец пил годами, и мы просто не знали, как ему помочь. Мы пытались лечить его дома, но срывы становились всё чаще. Врачи взялись за отца, и это был наш последний шанс. анонимная наркологическая помощь — что вернуло отца к жизни. Был под круглосуточным контролем врачей. Он вышел из клиники другим человеком — ясным, спокойным, снова начал улыбаться. наркологический центр в люберцах [url=https://narkologicheskaya-klinika-moskva-eip.ru]наркологический центр в люберцах[/url] Сохраните, поделитесь, не потеряйте для Московской области. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологическая клиника — это реальное решение проблемы!

  16. Мы не верили, что мой брат когда-нибудь сможет жить без алкоголя. Кодирование не помогало, таблетки не работали. Наркологическая клиника — это был наш последний шанс, и он сработал. И через два месяца мы увидели результат. Мы снова стали семьёй. кодировка Люберцы [url=https://kapelnica.narkologicheskaya-klinika-moskva-eip.ru]https://kapelnica.narkologicheskaya-klinika-moskva-eip.ru[/url] Там все контакты и условия для нашего города. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологическая клиника — это реальное решение проблемы!

  17. What’s up to every body, it’s my first visit of this website; this webpage carries remarkable and truly excellent data in favor of visitors.

  18. Когда он увидел, что теряет семью, работу, здоровье. Мы долго искали клинику в Казани, где это делают профессионально. процедура кодировки в Казани — это было то, что вернуло брата к жизни. Мы снова видим его улыбку, слышим его голос. Спасибо врачам за их профессионализм и терпение. нарколог кодирование от алкоголизма [url=https://alkogolizm.kodirovanie-ot-alkogolizma-kazan.ru]https://alkogolizm.kodirovanie-ot-alkogolizma-kazan.ru[/url] Это может спасти жизнь для столицы Татарстана. Если ваш близкий не может справиться с зависимостью — кодирование может стать шансом на новую жизнь. Кодирование от алкоголизма — это реальное решение проблемы!

  19. Основой вывода из запоя является инфузионная терапия, которую часто называют капельницей. Она позволяет быстро снять интоксикацию, восстановить водно-солевой баланс, нормализовать работу сердца, печени и почек, а также уменьшить проявления абстиненции и похмельного синдрома. Врач подбирает состав раствора индивидуально, в зависимости от тяжести состояния пациента и результатов осмотра. Стандартная капельница при запое обычно включает несколько компонентов, каждый из которых выполняет свою задачу. В нашей практике мы применяем только качественные сертифицированные препараты, которые прошли проверку и доказали свою эффективность.
    Получить больше информации – http://image.google.co.jp/url?sa=i&url=https://1.vyvod-iz-zapoya-moskva011.ru

  20. Мы не верили, что мой брат когда-нибудь сможет остановиться. Мы искали выход, но все методы давали только временный результат. лечение алкоголизма в стационаре Волгограда — это дало нам надежду. Работал с психологами, посещал групповые занятия. Мы снова стали семьёй. цены клиник вывода из запоя [url=https://alkogolizm.vyvod-iz-zapoya-v-staczionare-volgograd.ru]https://alkogolizm.vyvod-iz-zapoya-v-staczionare-volgograd.ru[/url] Там все контакты и условия для нашего города. Не ждите, пока станет поздно. Вывод из запоя в стационаре — это реальное решение проблемы!

  21. Он принял решение закодироваться. Где помогают не только телу, но и душе. Кодирование от алкоголизма — то, что дало ему шанс начать всё заново. Он прошёл процедуру, и уже полгода держится. Это был последний шаг, но он оказался правильным. кодировка казань цены [url=https://alkogolizm.kodirovanie-ot-alkogolizma-kazan.ru]https://alkogolizm.kodirovanie-ot-alkogolizma-kazan.ru[/url] По ссылке — подробная информация для столицы Татарстана. Если ваш близкий не может справиться с зависимостью — кодирование может стать шансом на новую жизнь. Кодирование от алкоголизма — это реальное решение проблемы!

  22. Запой следовал за запоем, и мы потеряли счёт его срывам. Мы искали выход, но все методы давали только временный результат. стационарное выведение из запоя — это был наш последний шанс, и он сработал. Работал с психологами, посещал групповые занятия. Мы снова стали семьёй. стационар вывод из запоя [url=https://alkogolizm.vyvod-iz-zapoya-v-staczionare-volgograd.ru]https://alkogolizm.vyvod-iz-zapoya-v-staczionare-volgograd.ru[/url] Это может спасти жизнь для области. Не ждите, пока станет поздно. Вывод из запоя в стационаре — это реальное решение проблемы!

  23. Он принял решение закодироваться. Где помогают не только телу, но и душе. закодироваться в клинике — это было то, что вернуло брата к жизни. Он вернулся к работе, к семье, к жизни. Это был последний шаг, но он оказался правильным. кодирование от алкоголизма уколом цена [url=https://alkogolizm.kodirovanie-ot-alkogolizma-kazan.ru]https://alkogolizm.kodirovanie-ot-alkogolizma-kazan.ru[/url] Сохраните, поделитесь, не потеряйте для столицы Татарстана. Если ваш близкий не может справиться с зависимостью — кодирование может стать шансом на новую жизнь. Кодирование от алкоголизма — это реальное решение проблемы!

  24. И мы просто наблюдали, как он разрушает себя. Мы искали выход, но все методы давали только временный результат. лечение алкоголизма в стационаре Волгограда — это был наш последний шанс, и он сработал. Он прошёл полный курс детоксикации и психотерапии. Он вышел из клиники другим человеком — ясным, спокойным, снова начал улыбаться. цена вывода из запоя в стационаре [url=https://alkogolizm.vyvod-iz-zapoya-v-staczionare-volgograd.ru]https://alkogolizm.vyvod-iz-zapoya-v-staczionare-volgograd.ru[/url] Там все контакты и условия для Волгограда. Не ждите, пока станет поздно. Вывод из запоя в стационаре — это реальное решение проблемы!

  25. Здравствуйте!
    Разработка сайтов для малого бизнеса должна звучать как доступное, но эффективное решение. Если текст ограничен словами «дёшево и быстро», доверия нет. Но если раскрыть: адаптивный дизайн, SEO продвижение, интеграция оплаты, настройка рекламы, поддержка, внимание сохраняется. Тогда сайт воспринимается как инструмент, который приносит клиентов.
    Полная информация по ссылке – https://www.ts-web.ru/blog/design/dark-theme.html
    интернет-магазин с интеграцией CRM Россия, реклама для малого бизнеса в Махачкале, SEO продвижение сайтов цена Россия
    оптимизация Google Ads под ключ, [url=https://www.ts-web.ru/blog/seo/semantic-core/.html]Семантическое ядро шаг за шагом: инструменты и лайфхаки | Блог TS-WEB[/url], локальное SEO продвижение по регионам
    Удачи и комфорта в жизни!
    [url=https://dljii.xin/thread-454118-1-1.html]Лендинг под ключ: один экран — много продаж[/url] 5da72f0

  26. Алкоголь стал его единственным другом, и мы просто не знали, как его вернуть. Тогда мы поняли: нужна клиника, стационар, профессиональная помощь. Мы нашли наркологическую клинику в Люберцах, где работают с такими случаями. лечение зависимостей в клинике — это было единственное, что реально помогло. И через два месяца мы увидели результат. Мы снова стали семьёй. наркологический центр в люберцах [url=https://detoks.narkologicheskaya-klinika-moskva-eip.ru]наркологический центр в люберцах[/url] Это может спасти жизнь для нашего города. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологическая клиника — это реальное решение проблемы!

  27. Но он срывался снова и снова. Мы просто смотрели, как он разрушает себя. И это действительно сработало. процедура кодировки в Казани — что дало ему шанс начать всё заново. Он вернулся к работе, к семье, к жизни. Спасибо врачам за их профессионализм и терпение. кодирование от алкоголизма цены [url=https://kodirovanie-ot-alkogolizma-kazan.ru]https://kodirovanie-ot-alkogolizma-kazan.ru[/url] Это может спасти жизнь для нашего города. Не ждите, пока станет поздно. Кодирование от алкоголизма — это реальное решение проблемы!

  28. Алкоголь стал его единственным другом, и мы просто не знали, как его вернуть. Но он срывался снова и снова. Мы нашли наркологический центр в Щёлково, где работают с такими случаями. лечение зависимостей в центре — это было единственное, что реально помогло. И через два месяца мы увидели результат. Мы снова стали семьёй. наркологический центр щёлково [url=https://alkogolizm.narkologicheskij-czentr-schelkovo.ru]наркологический центр щёлково[/url] Там все контакты и условия для Московской области. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологический центр — это реальное решение проблемы!

  29. Когда зависимость забирает человека, он перестаёт быть собой. Но он срывался снова и снова. Мы нашли наркологическую клинику в Люберцах, где работают с такими случаями. Наркологическая клиника — это было единственное, что реально помогло. Был под круглосуточным контролем врачей. Спасибо врачам за их труд и терпение. наркологическая клиника [url=https://detoks.narkologicheskaya-klinika-moskva-eip.ru]наркологическая клиника[/url] Там все контакты и условия для Московской области. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологическая клиника — это реальное решение проблемы!

  30. Когда его глаза были мутными, а руки тряслись. Я был в отчаянии, не знал, что делать. Позвонил, объяснил ситуацию, и мне сказали: «Приедем через час». выезд нарколога в Казани — это дало нам второй шанс. Через пару часов он открыл глаза и улыбнулся. Анонимно, без учёта, без лишних вопросов. наркологическая помощь на дому в казани [url=https://zapoy.narkolog-na-dom-v-kazani.ru]https://zapoy.narkolog-na-dom-v-kazani.ru[/url] Там все контакты и цены для столицы Татарстана. Если ваш близкий в запое — не ждите. Нарколог на дом — это реальность, и она работает!

  31. И кодирование, и капельницы, и психотерапию. Мы просто смотрели, как он разрушает себя. И это действительно сработало. процедура кодировки в Казани — что вернуло брата к жизни. Он прошёл процедуру, и уже несколько месяцев держится. Это был последний шаг, но он оказался правильным. кодирование цена [url=https://kodirovanie-ot-alkogolizma-kazan.ru]https://kodirovanie-ot-alkogolizma-kazan.ru[/url] Сохраните, поделитесь, не потеряйте для Казани. Не ждите, пока станет поздно. Кодирование от алкоголизма — это реальное решение проблемы!

  32. Когда зависимость забирает человека, он перестаёт быть собой. Но он срывался снова и снова. Врачи взялись за него, и это был наш последний шанс. лечение зависимостей в клинике — что сохранило нашу семью. И через два месяца мы увидели результат. Он вышел из клиники другим человеком — ясным, спокойным, снова начал улыбаться. наркологическая клиника [url=https://detoks.narkologicheskaya-klinika-moskva-eip.ru]наркологическая клиника[/url] Это может спасти жизнь для Люберец. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологическая клиника — это реальное решение проблемы!

  33. Алкоголь стал его единственным другом, и мы просто не знали, как его вернуть. И каждый раз всё глубже уходил в зависимость. Мы нашли наркологический центр в Щёлково, где работают с такими случаями. лечение зависимостей в центре — это было единственное, что реально помогло. Был под круглосуточным контролем врачей. Он вышел из центра другим человеком — ясным, спокойным, снова начал улыбаться. наркологический центр щёлково [url=https://alkogolizm.narkologicheskij-czentr-schelkovo.ru]наркологический центр щёлково[/url] Сохраните, поделитесь, не потеряйте для Подмосковья. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологический центр — это реальное решение проблемы!

  34. Я начал искать способ спасти его. Но он срывался снова и снова. Начали искать клинику в Люберцах, где работают с зависимостями. Наркологическая клиника — это было единственное, что реально помогло. И через два месяца мы увидели результат. Мы снова стали семьёй. вывод из запоя в люберцах [url=https://zapoy.narkologicheskaya-klinika-moskva-eip.ru]вывод из запоя в люберцах[/url] Там все контакты и условия для Московской области. Не ждите, пока станет поздно. Наркологическая клиника — это реальное решение проблемы!

  35. Когда его глаза были мутными, а руки тряслись. Я был в отчаянии, не знал, что делать. Случайно наткнулся на сайт, где предлагали вызвать нарколога на дом. Нарколог на дом — это было единственное, что помогло. Поставил капельницу, ввёл нужные препараты. Брат уснул спокойным сном. нарколога на дом [url=https://zapoy.narkolog-na-dom-v-kazani.ru]нарколога на дом[/url] Пригодится, если случится беда для нашего города. Каждый час на счету. Нарколог на дом — это реальность, и она работает!

  36. Алкоголь стал его единственным другом, и мы просто не знали, как его вернуть. И каждый раз всё глубже уходил в зависимость. Врачи взялись за него, и это был наш последний шанс. стационарное лечение алкоголизма в Люберцах — что сохранило нашу семью. Работал с психологами, посещал групповые занятия. Мы снова стали семьёй. капельница от наркотиков в люберцах [url=https://detoks.narkologicheskaya-klinika-moskva-eip.ru]https://detoks.narkologicheskaya-klinika-moskva-eip.ru[/url] Сохраните, поделитесь, не потеряйте для Московской области. Не ждите, пока станет поздно. Наркологическая клиника — это реальное решение проблемы!

  37. Когда алкоголь стал его единственным смыслом. Мы перепробовали всё, что можно — и капельницы, и кодирование, и уговоры. И нашли ту, которая дала результат. лечение зависимостей в клинике — что вернуло брата к жизни. Работал с психологами, посещал групповые занятия. Мы снова стали семьёй. государственная наркологическая клиника в люберцах [url=https://zapoy.narkologicheskaya-klinika-moskva-eip.ru]государственная наркологическая клиника в люберцах[/url] Это может спасти жизнь для Московской области. Не ждите, пока станет поздно. Наркологическая клиника — это реальное решение проблемы!

  38. Мой брат перестал выходить из дома, перестал общаться с семьёй. И каждый раз всё глубже уходил в зависимость. Мы нашли наркологическую клинику в Люберцах, где работают с такими случаями. лечение зависимостей в клинике — что сохранило нашу семью. Был под круглосуточным контролем врачей. Он вышел из клиники другим человеком — ясным, спокойным, снова начал улыбаться. реабилитация наркозависимых в люберцах [url=https://detoks.narkologicheskaya-klinika-moskva-eip.ru]реабилитация наркозависимых в люберцах[/url] По ссылке — подробная информация для нашего города. Не ждите, пока станет поздно. Наркологическая клиника — это реальное решение проблемы!

  39. Но он срывался снова и снова. И не знали, что ещё можно сделать. Тогда мы решились на кодирование в клинике в Казани. закодироваться в клинике — что дало ему шанс начать всё заново. Он вернулся к работе, к семье, к жизни. Спасибо врачам за их профессионализм и терпение. сколько стоит кодирование от алкоголя [url=https://kodirovanie-ot-alkogolizma-kazan.ru]https://kodirovanie-ot-alkogolizma-kazan.ru[/url] Сохраните, поделитесь, не потеряйте для Казани. Если ваш близкий не может справиться с зависимостью — кодирование может стать шансом на новую жизнь. Кодирование от алкоголизма — это реальное решение проблемы!

  40. Когда его глаза были мутными, а руки тряслись. А он не хотел, он просто лежал и молчал. Позвонил, объяснил ситуацию, и мне сказали: «Приедем через час». выезд нарколога в Казани — это было единственное, что помогло. Через пару часов он открыл глаза и улыбнулся. Брат уснул спокойным сном. вызов нарколога на дом [url=https://zapoy.narkolog-na-dom-v-kazani.ru]вызов нарколога на дом[/url] По ссылке — подробная информация для нашего города. Каждый час на счету. Нарколог на дом — это реальность, и она работает!

  41. Алкоголь стал его единственным другом, и мы просто не знали, как его вернуть. И каждый раз всё глубже уходил в зависимость. Врачи взялись за него, и это был наш последний шанс. стационарное лечение алкоголизма в Щёлково — это было единственное, что реально помогло. Был под круглосуточным контролем врачей. Мы снова стали семьёй. нарколога на дом щёлково [url=https://alkogolizm.narkologicheskij-czentr-schelkovo.ru]нарколога на дом щёлково[/url] По ссылке — подробная информация для Щёлково. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологический центр — это реальное решение проблемы!

  42. Но он срывался снова и снова. Он терял работу, друзей, здоровье. Тогда мы решились на кодирование в клинике в Казани. процедура кодировки в Казани — что вернуло брата к жизни. Мы снова видим его улыбку, слышим его голос. Спасибо врачам за их профессионализм и терпение. вывод из запоя кодировка [url=https://kodirovanie-ot-alkogolizma-kazan.ru]https://kodirovanie-ot-alkogolizma-kazan.ru[/url] Сохраните, поделитесь, не потеряйте для республики. Не ждите, пока станет поздно. Кодирование от алкоголизма — это реальное решение проблемы!

  43. Я начал искать способ спасти его. Но он срывался снова и снова. Начали искать клинику в Люберцах, где работают с зависимостями. Наркологическая клиника — что сохранило нашу семью. И через два месяца мы увидели результат. Мы снова стали семьёй. нарколог на дом анонимно люберцы [url=https://zapoy.narkologicheskaya-klinika-moskva-eip.ru]https://zapoy.narkologicheskaya-klinika-moskva-eip.ru[/url] Это может спасти жизнь для нашего города. Если ваш близкий не может справиться с зависимостью — стационар даёт шанс на новую жизнь. Наркологическая клиника — это реальное решение проблемы!

  44. Я понял: ещё немного — и я потеряю его навсегда. А он не хотел, он просто лежал и молчал. Случайно наткнулся на сайт, где предлагали вызвать нарколога на дом. Нарколог на дом — это было единственное, что помогло. Через пару часов он открыл глаза и улыбнулся. Брат уснул спокойным сном. срочный вызов нарколога на дом [url=https://zapoy.narkolog-na-dom-v-kazani.ru]https://zapoy.narkolog-na-dom-v-kazani.ru[/url] Сохраните, поделитесь, не потеряйте для столицы Татарстана. Если ваш близкий в запое — не ждите. Нарколог на дом — это реальность, и она работает!

  45. Когда зависимость забирает человека, он перестаёт быть собой. И каждый раз всё глубже уходил в зависимость. Врачи взялись за него, и это был наш последний шанс. анонимная наркологическая помощь — что сохранило нашу семью. Работал с психологами, посещал групповые занятия. Он вышел из центра другим человеком — ясным, спокойным, снова начал улыбаться. стационар наркологический [url=https://alkogolizm.narkologicheskij-czentr-schelkovo.ru]https://alkogolizm.narkologicheskij-czentr-schelkovo.ru[/url] Сохраните, поделитесь, не потеряйте для Подмосковья. Не ждите, пока станет поздно. Наркологический центр — это реальное решение проблемы!

  46. Когда я понял, что мой брат потерял контроль над своей жизнью. Мы перепробовали всё, что можно — и капельницы, и кодирование, и уговоры. И нашли ту, которая дала результат. анонимная наркологическая помощь — это было единственное, что реально помогло. Работал с психологами, посещал групповые занятия. Спасибо врачам за их труд и терпение. выезд нарколога на дом люберцы [url=https://zapoy.narkologicheskaya-klinika-moskva-eip.ru]https://zapoy.narkologicheskaya-klinika-moskva-eip.ru[/url] Там все контакты и условия для Люберец. Не ждите, пока станет поздно. Наркологическая клиника — это реальное решение проблемы!

  47. Мы не верили, что мой брат когда-нибудь сможет жить без алкоголя. Мы искали выход, но все методы давали только временный результат. анонимная наркологическая помощь — это дало нам надежду. И через два месяца мы увидели результат. Мы снова стали семьёй. наркология щёлково [url=https://zapoy.narkologicheskij-czentr-schelkovo.ru]наркология щёлково[/url] Сохраните, поделитесь, не потеряйте для Московской области. Не ждите, пока станет поздно. Наркологический центр — это реальное решение проблемы!

  48. Но он срывался снова и снова. Мы просто смотрели, как он разрушает себя. Тогда мы решились на кодирование в клинике в Казани. закодироваться в клинике — это было единственное, что реально помогло. Он вернулся к работе, к семье, к жизни. Спасибо врачам за их профессионализм и терпение. закодировать в казани [url=https://kodirovanie-ot-alkogolizma-kazan.ru]https://kodirovanie-ot-alkogolizma-kazan.ru[/url] Там все контакты и условия для столицы Татарстана. Не ждите, пока станет поздно. Кодирование от алкоголизма — это реальное решение проблемы!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注