Сколько памяти поток использует когда сначала созданный?

Вам не нужно разбивать приложение.

Вы можете определить свой модуль следующим образом:

@Module({
  providers: [
    MyGateway,
    MyService,
  ],
})
export class MyModule {}

, где gateway отвечает за канал веб-сокетов

import { SubscribeMessage, WebSocketGateway } from '@nestjs/websockets'
import { Socket } from 'socket.io'
...
@WebSocketGateway()
export class MyGateway {
  constructor(private readonly myService: MyService) {}

  @SubscribeMessage('MY_MESSAGE')
  public async sendMessage(socket: Socket, data: IData): Promise<IData> {
    socket.emit(...)
  }
}

, а service отвечает за канал TCP

import { Client, ClientProxy, Transport } from '@nestjs/microservices'
...
@Injectable()
export class MyService {
  @Client({
    options: { host: 'MY_HOST', port: MY_PORT },
    transport: Transport.TCP,
  })
  private client: ClientProxy

  public async myFunction(): Promise<IData> {
    return this.client
      .send<IData>({ cmd: 'MY_MESSAGE' })
      .toPromise()
      .catch(error => {
        throw new HttpException(error, error.status)
      })
  }
}
8
задан MPelletier 30 April 2012 в 04:10
поделиться

6 ответов

У меня есть серверное приложение, которое тяжело в использовании потока, оно использует настраиваемый пул потоков, который настраивается клиентом, и по крайней мере в одном сайте оно имеет 1000 + потоки, и при запуске оно использует только 50 МБ. Причина состоит в том, что Windows резервирует 1 МБ для стека (он отображает свое адресное пространство), но он не обязательно выделяется в физической памяти, только меньшей части его. Если стек выращивает больше, чем которые сгенерировано отсутствие страницы, и больше физической памяти выделяется. Я не знаю, каково начальное выделение, но я предположил бы, что это равно гранулярности страницы системы (обычно 64 КБ). Конечно, поток также использовал бы немного больше памяти для других вещей при создании (TLS, TSS, и т.д.), но мое предположение для общего количества составит приблизительно 200 КБ. И примите во внимание, что любая память, которая не часто используется, была бы разгружена диспетчером виртуальной памяти.

7
ответ дан 5 December 2019 в 15:28
поделиться

Добавление к комментариям Fabios:

Память является Вашим вторым беспокойством, не Вашим первым. Цель пула потоков состоит в том, чтобы обычно ограничивать контекстное переключение наверху между потоками, которые хотят работать одновременно, идеально к количеству доступных ядер процессора.

Контекстное переключение является очень дорогим, часто заключаемое в кавычки в нескольких тысячах к 10 000 + циклы ЦП.

Немного теста на WinXP (32 бита) начинает работу приблизительно в 15k частные байты на поток (999 созданных потоков). Это - фиксировавший размер стека начальной буквы плюс любые другие данные, управляемые ОС.

4
ответ дан 5 December 2019 в 15:28
поделиться

Если Вы используете Vista, или Win2k8 просто используют собственный пул потоков Win32 API. Позвольте ему выяснить калибровку. Я также считал бы типы разделения рабочих нагрузок, например, ЦП интенсивными по сравнению с Диском ввод-вывод в различные пулы.

Пул потоков MSDN документы API

http://msdn.microsoft.com/en-us/library/ms686766 (По сравнению с 85) .aspx

1
ответ дан 5 December 2019 в 15:28
поделиться

Я думаю, что Вам было бы нелегко обнаруживать любое влияние того, чтобы заставлять это своего рода измениться на рабочий код - 20 потоков вниз к 5. И затем прибавьте добавленную сложность (и наверху) управления пулом потоков. Возможно, достойный рассмотрения во встроенной системе, но Win32?

И можно установить размер стека на то, что Вы хотите.

0
ответ дан 5 December 2019 в 15:28
поделиться

Это зависит высоко от системы:

Но обычно, каждый обрабатывает, независимо. Обычно системный планировщик удостоверяется, что каждый обрабатывает, получает равный доступ к доступному процессору. Таким образом многопоточное время приложения мультиплексируется между доступными потоками.

Память, выделенная потоку, будет влиять на память, доступную процессам, но не памяти, доступной другим процессам. Хорошая ОС разобьет на страницы неиспользованное стековое пространство, таким образом, это не будет в физической памяти. Хотя, если Ваши потоки выделяют достаточно памяти, в то время как живой Вы могли вызвать перегрузку, поскольку память каждого процессора разбита на страницы к/от вторичному устройству.

Я сомневаюсь, что поток сна оказывает любое (очень небольшое) влияние на систему.

  • Это не использует ЦП
  • Любая память, которую это использует, может быть разбита на страницы к вторичному устройству.
0
ответ дан 5 December 2019 в 15:28
поделиться

Я предполагаю, что это может измеряться довольно легко.

  1. Получите сумму ресурсов, используемых системой прежде, чем создать поток
  2. Создайте поток с системными значениями по умолчанию (размер "кучи" по умолчанию и другие)
  3. Получите сумму ресурсов после создания потока и имейте значение (с шагом 1).

Обратите внимание, что некоторые потоки должны быть указаны различные значения, чем по умолчанию.

Можно попытаться найти среднее использование памяти путем создания различного количества потоков (шаг 2).

Память, выделенная ОС при создании потока, состоит из потоков локальные данные: TCB TLS...

Из Википедии: "Потоки не владеют ресурсами за исключением стека, копии регистров включая счетчик команд и локальной памяти потока (если таковые имеются)".

-1
ответ дан 5 December 2019 в 15:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: