Here are some settings that helped me out with a similar issue:
# Limit total dirty data to 60MB
sysctl vm.dirty_bytes=62914560
# Only use transparent hugepages on request via madvise()
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
These settings may not be for everyone. In particular, the second issue is supposedly much better in recent (>= 3.3) kernels. However, these changes did get rid of most of my writeback issues.