Re: NGX_POOL_ALIGNMENT

2017-09-27 Пенетрантность Oleg
On Wed, Sep 27, 2017 at 06:35:19AM +0300, Maxim Dounin wrote:
> Hello!
> 
> Дальше могут начинаться всякие нюансы, например, с cacheline size: 
> e.g., если мы работаем со структурой в 64 байта размером, и 
> cacheline size у нас 64, то выравнивать лучше на те же 64 - тогда 
> вся структура будет загружаться в кеш процессора сразу.  Если же 
> выравнивать на 8, то одна структура с высокой вероятностью 
> разъедется по двум строкам кеша, и соответственно работать это 
> будет медленнее, чем могло бы.

  Это если на 64 всё выравнивать, то вообще кошмар будет с
утилизацией памяти - сплошные дыры.

-- 
Олег Неманов (Oleg Nemanov)
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: NGX_POOL_ALIGNMENT

2017-09-26 Пенетрантность Maxim Dounin
Hello!

On Tue, Sep 26, 2017 at 11:33:50AM +0300, Oleg wrote:

> On Mon, Sep 25, 2017 at 02:44:47PM +0300, Maxim Dounin wrote:
> > 
> > Абсолютно.  Ну то есть это, безусловно, зависит от многих 
> > факторов, но на Линуксе со штатным аллокатором на 64-битных 
> > платформах - будет 16:
> > 
> > https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html
> > 
> > : The address of a block returned by malloc or realloc in GNU 
> > : systems is always a multiple of eight (or sixteen on 64-bit 
> > : systems).
> 
>   Спасибо за ссылку. Похоже man для memalign забыли поправить для
> 64-битных процессоров.
>   Для общего понимания, если отвлечься от конкретно ngx_pool,
> выравнивания в 8 байт для целых типов(кроме float, double и прочих
> SSE/AVX) достаточно для быстрого доступа?
> Например, мы выделяем большой кусок памяти и в нём уже выделяем куски
> поменьше под всякие char* и выравниваем их на границы 8 байт.

Для переменных простых типов - выравнивания на 8 байт AFAIK 
достаточно, чтобы процессор работал быстро (если не брать в расчёт 
SIMD-инструкции).

Дальше могут начинаться всякие нюансы, например, с cacheline size: 
e.g., если мы работаем со структурой в 64 байта размером, и 
cacheline size у нас 64, то выравнивать лучше на те же 64 - тогда 
вся структура будет загружаться в кеш процессора сразу.  Если же 
выравнивать на 8, то одна структура с высокой вероятностью 
разъедется по двум строкам кеша, и соответственно работать это 
будет медленнее, чем могло бы.

-- 
Maxim Dounin
http://nginx.org/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: NGX_POOL_ALIGNMENT

2017-09-26 Пенетрантность Oleg
On Mon, Sep 25, 2017 at 02:44:47PM +0300, Maxim Dounin wrote:
> 
> Абсолютно.  Ну то есть это, безусловно, зависит от многих 
> факторов, но на Линуксе со штатным аллокатором на 64-битных 
> платформах - будет 16:
> 
> https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html
> 
> : The address of a block returned by malloc or realloc in GNU 
> : systems is always a multiple of eight (or sixteen on 64-bit 
> : systems).

  Спасибо за ссылку. Похоже man для memalign забыли поправить для
64-битных процессоров.
  Для общего понимания, если отвлечься от конкретно ngx_pool,
выравнивания в 8 байт для целых типов(кроме float, double и прочих
SSE/AVX) достаточно для быстрого доступа?
Например, мы выделяем большой кусок памяти и в нём уже выделяем куски
поменьше под всякие char* и выравниваем их на границы 8 байт.

-- 
Олег Неманов (Oleg Nemanov)
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: NGX_POOL_ALIGNMENT

2017-09-25 Пенетрантность Maxim Dounin
Hello!

On Mon, Sep 25, 2017 at 11:41:43AM +0300, lego12...@yandex.ru wrote:

> On Sun, Sep 24, 2017 at 02:44:13AM +0300, Maxim Dounin wrote:
> > On Fri, Sep 22, 2017 at 11:45:27AM +0300, Oleg wrote:
> > > 
> > >   Т.е. если выставить в 8 (sizeof(void*)), то должно быть норм, так?
> > 
> > На практике разницы не будет, в том смысле, что на современных 
> > 64-битных платформах возвращаемая память всё равно будет выровнена 
> > на 16.
> 
>   Хм. Максим, я вот что вычитал в man memalign (funtoo linux):
> 
>The glibc malloc(3) always returns 8-byte  aligned  memory  addresses, 
>  so
>these functions are needed only if you require larger alignment values.
> 
>   Вы уверены, что 16?

Абсолютно.  Ну то есть это, безусловно, зависит от многих 
факторов, но на Линуксе со штатным аллокатором на 64-битных 
платформах - будет 16:

https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html

: The address of a block returned by malloc or realloc in GNU 
: systems is always a multiple of eight (or sixteen on 64-bit 
: systems).

И на FreeBSD на практике тоже будет 16, причём даже для 32-битных 
платформ - выравнивание 8 возможно только для аллокаций не больше 
8 байт, что в данном случае гарантировано не так.

-- 
Maxim Dounin
http://nginx.org/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: NGX_POOL_ALIGNMENT

2017-09-25 Пенетрантность lego12239
On Sun, Sep 24, 2017 at 02:44:13AM +0300, Maxim Dounin wrote:
> On Fri, Sep 22, 2017 at 11:45:27AM +0300, Oleg wrote:
> > 
> >   Т.е. если выставить в 8 (sizeof(void*)), то должно быть норм, так?
> 
> На практике разницы не будет, в том смысле, что на современных 
> 64-битных платформах возвращаемая память всё равно будет выровнена 
> на 16.

  Хм. Максим, я вот что вычитал в man memalign (funtoo linux):

   The glibc malloc(3) always returns 8-byte  aligned  memory  addresses,  
so
   these functions are needed only if you require larger alignment values.

  Вы уверены, что 16?

-- 
Олег Неманов (Oleg Nemanov)
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: NGX_POOL_ALIGNMENT

2017-09-23 Пенетрантность Maxim Dounin
Hello!

On Fri, Sep 22, 2017 at 11:45:27AM +0300, Oleg wrote:

> On Thu, Sep 21, 2017 at 05:43:12PM +0300, Maxim Dounin wrote:
> > On Thu, Sep 21, 2017 at 11:35:45AM +0300, Oleg wrote:
> > 
> > > Кто-нибудь в курсе почему NGX_POOL_ALIGNMENT равен именно 16?
> > 
> > Сколько-нибудь серьёзных причин к тому нет.  Одно время были 
> > попытки выравнивать пулы по размеру страницы - это хорошо работает 
> > на FreeBSD, где метаинформация об аллокациях храница отдельно, 
> > однако плохо показало себя на Линуксе, где метаинформация хранится 
> > непосредственно перед аллокацией.  В результате выравнивание было 
> > уменьшено до консервативного значения 16, и с тех пор такое.
> 
>   Т.е. если выставить в 8 (sizeof(void*)), то должно быть норм, так?

На практике разницы не будет, в том смысле, что на современных 
64-битных платформах возвращаемая память всё равно будет выровнена 
на 16.

-- 
Maxim Dounin
http://nginx.org/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: NGX_POOL_ALIGNMENT

2017-09-22 Пенетрантность Oleg
On Thu, Sep 21, 2017 at 05:43:12PM +0300, Maxim Dounin wrote:
> On Thu, Sep 21, 2017 at 11:35:45AM +0300, Oleg wrote:
> 
> > Кто-нибудь в курсе почему NGX_POOL_ALIGNMENT равен именно 16?
> 
> Сколько-нибудь серьёзных причин к тому нет.  Одно время были 
> попытки выравнивать пулы по размеру страницы - это хорошо работает 
> на FreeBSD, где метаинформация об аллокациях храница отдельно, 
> однако плохо показало себя на Линуксе, где метаинформация хранится 
> непосредственно перед аллокацией.  В результате выравнивание было 
> уменьшено до консервативного значения 16, и с тех пор такое.

  Т.е. если выставить в 8 (sizeof(void*)), то должно быть норм, так?

-- 
Олег Неманов (Oleg Nemanov)
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: NGX_POOL_ALIGNMENT

2017-09-21 Пенетрантность Maxim Dounin
Hello!

On Thu, Sep 21, 2017 at 11:35:45AM +0300, Oleg wrote:

> Кто-нибудь в курсе почему NGX_POOL_ALIGNMENT равен именно 16?

Сколько-нибудь серьёзных причин к тому нет.  Одно время были 
попытки выравнивать пулы по размеру страницы - это хорошо работает 
на FreeBSD, где метаинформация об аллокациях храница отдельно, 
однако плохо показало себя на Линуксе, где метаинформация хранится 
непосредственно перед аллокацией.  В результате выравнивание было 
уменьшено до консервативного значения 16, и с тех пор такое.

-- 
Maxim Dounin
http://nginx.org/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

NGX_POOL_ALIGNMENT

2017-09-21 Пенетрантность Oleg
  Всем привет.

Кто-нибудь в курсе почему NGX_POOL_ALIGNMENT равен именно 16?

-- 
Олег Неманов (Oleg Nemanov)
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru