Pull to refresh
27
0

User

Send message
Здесь нужно разбираться в логах, вполне вероятно, что причина такого поведения кроется не только в вытащенном вентиляторе.

Вентилятор был вытащен как раз для того, чтобы проверить как поведет себя сервер. Предыдущее поколение серверов нормально это переживало.
С железом HP работаю уже давно и, надо сказать, HP у меня один из любимых вендоров. Недавно в руки попал новенький G8, удивила логика работы этого сервера, а точнее разочаровала. Вот подробности:
1. Сервер был собран.
2. Включен, по какой-то причине один из внутренних вентиляторов не запустился, в итоге сервер не захотел запускаться.
3. Поменяли местами вентиляторы сервер запустился.
4. Решили провести эксперимент, поставили OS и выдернули один из вентиляторов, в итоге как и полагается обороты оставшихся увеличились, но сервак ушел в ребут и больше загрузится не смог, т.к. система предварительной проверки убеждала нас, что охлаждения не хватает.

Всегда считал, что серверное железо должно любой ценой продолжать работу, но тут оказалось все наоборот.
Может быть эта логика где-то меняется?
Спасибо за статью!
Я, чтобы преодолеть свою робость, в свое время, пошел в театральный кружок. Там и голос поставили (это очень важно, теперь могу без микрофона держать большую аудиторию, не надрывая связки) и научили всем навыкам хорошего выступления.
>vCenter linux based Virtual Appliance – Честно говоря, я пока не понял в чем преимущества работы vCenter на линуксе

Преимущества есть, у меня было несколько внедрений, когда вся инфраструктура была построена на linux (Ubuntu, SUSE, etc.) и клиенты не понимали почему нет vCenter для linux и им нужно покупать winsrv. Теперь они ждут с нетерпением когда выйдет vSphere 5 и они избавятся от этого виндового сервера.
К сожалению в статье не приводится пример кода. Столкнувшись на практике с необходимостью разработать MVC приложение на ExtJS наткнулся на множество граблей.
А для профессионального роста что посоветуешь почитать? Ведь по эрлангу не так много хороших ресурсов. Ты как в этом направлении двигался? Изучать чужой код?
Макс, спасибо за отличный комментарий! Буду дальше учиться. Запуск через spawn_link я отметил как минус. Для связи не OTP с OTP процессами можно использовать supervisor_bridge или вообще лучше этого не делать?
Что посоветуешь для углубления знаний?
Используя spawn_link/1 можно не экспортировать функцию.
Дело в том, что мы создаем процесс, вызывая функцию erlang:spawn_link/3 (spawn_link(?MODULE, accept_func, [LSocket]), чтобы вызов был успешен нужно экспортировать функцию accept_func. Использовать функцию с одним аргументом erlang:spawn_link/1 не получится, т.к. в accept_func нам дополнительно нужно передать слушающий сокет (LSocket).
Давно ждал новую версию. Спасибо!
Единственное, что не нравится — это то, как происходит авто форматирование кода, посмотрю, может в новой версии что-то изменилось.
В данном решении есть один минус — это использование недокументированных фич, таких как prim_inet. Никто не даст гарантию, что в будущем это будет работать. Можно придумать как минимум два подхода для построения а-ля неблокирующего TCP сервера. Будет время напишу статью.
Если не секрет, сколько всё про всё, стоит туда съездить?
То, что на erlang-factory.com выкладывают, бывает плохого качества.
Видео будет с конференции? :)
Ядерные виртуальные машины :)
Расскажите лучше про них.
Да, действительно, даже по логике это самый верный путь. Связь ведь уже не нужна.
А если мы не выключаем монитор и наблюдаемый процесс умирает, созданные ссылки остаются где-то во внутренних структурах процесса? Просто сам ещё не копал глубже.
На эрланге. Самой затратной по времени является часть eval, где собранное эрланговское выражение (например: 123-45-67+89.) вычисляется. А генерация размещений с повторениями и генерация строк для вычисления происходит достаточно быстро.
-module(test).
-export([find/0]).

perms(L, 0, N) ->
	L;
perms(L, K, N) ->
	perms([ [X|Lx] || X <- N, Lx <- L], K-1, N).

make_str(Nums, [], Res) ->
	Res;
make_str(Nums, [H_op|T_op], Res) ->
	S = lists:concat(lists:zipwith(
                   fun(X, Y) -> lists:concat([X,Y]) end, 
                   Nums, H_op)),
	make_str(Nums, T_op, [S|Res]).

eval([], Count) ->
	Count;
eval([H_exp|T_exp], Count) ->
	{ok, Tokens, _} = erl_scan:string(H_exp),
	{ok, [Form]} = erl_parse:parse_exprs(Tokens),
	{value, Res, _} = erl_eval:expr(Form, []),
	if
		Res == 100 ->
			io:format("~p = ~p~n", [H_exp, Res]),
			eval(T_exp, Count+1);
		true ->
			eval(T_exp, Count)
	end.

find() ->
	statistics(wall_clock),
	Nums = [1,2,3,4,5,6,7,8,9],
	Op = ['', '-', '+', '*', '/'],
	Ops = perms([['.']], 8, Op),
	Expr = make_str(Nums, Ops, []),
	io:format("Count: ~p~n", [eval(Expr, 0)]),
	{_, Time} = statistics(wall_clock),
        io:format("Time=~p~n" , [Time / 1000]).	
В большинстве случаев просто брать какую-либо технологию и применять её из-за того, что она клевая, ничем хорошим не заканчивается. Для каждого класса задач есть свои эффективные инструменты, и чтобы их выбрать нужно провести хороший анализ.
1

Information

Rating
Does not participate
Location
Киров (Кировская обл.), Кировская обл., Россия
Works in
Date of birth
Registered
Activity