2013-11-22 11 views
5

Mam więc interesującą sytuację i nie wiem, jak sobie z tym poradzić.Ustaw limit czasu ładowania pliku z udziału EBS

Mamy proces, który skupia się na naszych danych sprzedaży, a następnie tworzy wykres za pomocą Google Chart. Aby nie uderzać w bazę danych (lub Google), uruchamia się to tylko co 30 minut. Sprawdza poprzedni plik, aby ustalić, czy przekroczył próg 30 minut, a jeśli tak, to tworzy nowy plik. Mamy dwa serwery za równoważnikiem obciążenia. Tak więc oba serwery muszą mieć dostęp do tej samej lokalizacji, aby przechowywać ten plik. Zrobiliśmy to za pomocą udziału EBS, zamontowanego za pośrednictwem NFS (cała nasza instalacja jest w AWS). Ten proces działa dobrze.

Problem polega czasami na tym, że udział EBS jest powolny lub odłączony. Powoduje to efekt marszczenia, podczas gdy nasze wewnętrzne narzędzia czekają na ten jeden plik do przetworzenia (chyba że wyłączysz powiadomienie). Czytałem kilka wątków (takich jak this one), które mówią o stream_set_timeout, ale nie jest jasne, w jaki sposób użyłbyś tego z ładowaniem pliku (to nie jest dokładnie strumień) i nie mogłem znaleźć żadnych przykładów.

Oto urywek do daje wyobrażenie co plik PHP robi

$file = '/ebs/path/to/image.png'; 
$newfile=false; 
if(!is_file($file)) $newfile=true; 
elseif(filemtime($file)+1800 < time()) { 
    $newfile=true; 
    unlink($file); 
} 
if(!$newfile){ 
    $i=imagecreatefrompng($file); 
    header('Content-Type: image/png'); 
    header('Expires: ' . gmdate('D, d M Y H:i:s', filemtime($file) + $timeout) . ' GMT'); 
    imagepng($i); 
    imagedestroy($i); 
    exit; 
} else { 
    // Build and output a new file here 
} 

Jak mogę stworzyć limit czasu dla tego scenariusza?

+0

Główną przyczyną jest "EBS jest wolne lub odłączone", więc najlepszym rozwiązaniem jest naprawienie tego. Niezależnie od tego, czy AWS spełnia swoje zadanie, to kolejne pytanie. –

Odpowiedz

4

To jest bardziej rozwiązanie problemu niż odpowiedź na pytanie, ale proszę publikować dane wyjściowe z iostat -x 1 zarówno wtedy, gdy serwer działa poprawnie i gdy trwa ładowanie pliku. Odkryłem, że gdy avgqu-sz ma wartość powyżej 30, nawet na dyskach z obsługą IOPS (nasze są obsługiwane w 2000 IOPS), a następnie EBS spowalnia do indeksowania. Rozwiązaniem jest starać się nie czytać ani nie pisać do niego przez sekundę lub trzy, dopóki sytuacja się nie wyjaśni.

Spróbuj również klonować wolumin i użyć klonu zamiast oryginalnej objętości. Odkryłem, że niektóre systemy AWS są po prostu "złe" i wymagają wymiany: dotyczy to instancji EC2, woluminów EBS, usług RDS i innych. Prawdopodobnie dzieje się tak, gdy szczęście doprowadzi cię do używania sprzętu z maszyną wirtualną z innym użytkownikiem, który może nie być dobrym sąsiadem. Po prostu klonowanie zasobu i jego ponowne uruchomienie zazwyczaj przenosi go na inny sprzęt i rozwiązuje takie problemy.

EDIT: Czytaj this great post o tym, jak interpretować iostat wyjście, z naciskiem na jak iostat dotyczy EBS. Czytałem to kilkanaście razy.

+0

Ja przegłosowałem to (ponieważ jest to bardzo użyteczne informacje) i nadałem mu nagrodę za bounty (jako że była to jedyna odpowiedź), ale, jak stwierdzono, tak naprawdę nie odpowiada na pytanie, więc nie oznaczałem go jako takiego. Nadal chciałbym, aby ktoś wytłumaczył 'stream_set_timeout'. Ale mimo to dobre informacje. – Machavity